我有一个类似于以下的Pandas DataFrame
data=pd.DataFrame([['Juan',0,0,400,450,500],['Luis',100,100,100,100,100],[ 'Maria',0,20,50,300,500],[ 'Laura',0,0,0,100,900],['Lina',0,0,0,0,10]])
data.columns=['Name','Date1','Date2','Date3','Date4','Date5']
Name Date1 Date2 Date3 Date4 Date5
0 Juan 0 0 400 450 500
1 Luis 100 100 100 100 100
2 Maria 0 20 50 300 500
3 Laura 0 0 0 100 900
4 Lina 0 0 0 0 10
我想生成两个单独的数据帧。第一个应该在先前DataFrame的非零值的所有位置都包括1,即
Name Date1 Date2 Date3 Date4 Date5
0 Juan 0 0 1 1 1
1 Luis 1 1 1 1 1
2 Maria 0 1 1 1 1
3 Laura 0 0 0 1 1
4 Lina 0 0 0 0 1
第二个应该在每行的第一个非零值中具有1。
Name Date1 Date2 Date3 Date4 Date5
0 Juan 0 0 1 0 0
1 Luis 1 0 0 0 0
2 Maria 0 1 0 0 0
3 Laura 0 0 0 1 0
4 Lina 0 0 0 0 1
我检查了其他帖子,发现我可以通过以下内容获得第一篇
out=data.copy()
out.iloc[:,1:6]=data.select_dtypes(include=['number']).where(data.select_dtypes(include=['number'])==0,1)
有什么更简单的方法可以达到我想要的第一个结果?和
有谁知道如何获得第二个结果?(当然,还有一个双循环,按数字比较数字,这是我宁愿避免的强力方法)
首先,您只能选择数字列,并用in 替换非0
值,然后第二个,将累加总和与比较第一个值和布尔掩码转换为整数:1
DataFrame.mask
axis=1
1
DataFrame.eq
DataFrame.astype
df1, df2 = data.copy(), data.copy()
cols = df1.select_dtypes(include=np.number).columns
df1[cols] = df1[cols].mask(data[cols].ne(0), 1)
df2[cols] = df1[cols].cumsum(axis=1).eq(1).astype(int)
print(df1)
Name Date1 Date2 Date3 Date4 Date5
0 Juan 0 0 1 1 1
1 Luis 1 1 1 1 1
2 Maria 0 1 1 1 1
3 Laura 0 0 0 1 1
4 Lina 0 0 0 0 1
print(df2)
Name Date1 Date2 Date3 Date4 Date5
0 Juan 0 0 1 0 0
1 Luis 1 0 0 0 0
2 Maria 0 1 0 0 0
3 Laura 0 0 0 1 0
4 Lina 0 0 0 0 1
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句