python - 识别 Pandas DataFrame 中每一行的第一个和所有非零值
问题描述
我有一个类似于以下的 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)
有没有更简单/更简单的方法来实现我想要的第一个结果?和
有谁知道如何实现第二个结果?(当然还有一个比较数字的双循环,这将是我宁愿避免的蛮力方法)
解决方案
首先,您可以仅选择数字列并将非0
值替换为1
in DataFrame.mask
,然后为第二个添加累积总和 peraxis=1
与比较第一个1
值 byDataFrame.eq
和布尔掩码转换为整数 by 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
推荐阅读
- c# - 葡萄藤:如何解析表单数据
- python-3.x - 如何在泛型类类型提示中使用 TypeVar 有界类型属性
- r - 如何在 r 中读取整个 yelp 数据集用户
- linux-kernel - 从嵌入式设备上的芯片读取时出现设备或资源忙错误
- javascript - 渲染选择元素后,react-hook-form watch 的值错误
- python - now() 在模块中无法识别
- reactjs - 如果键相同,React 是否会忽略作为用于更新元素的数组缓冲区的道具?
- javascript - 结果在 React.js 中陷入无限循环
- jquery - dataTables.fixedHeader.min.js:未捕获类型错误:a.settings()[0] 未定义
- c# - 更改密码或关闭标签后注销用户