为了账号安全,请及时绑定邮箱和手机立即绑定

识别 Pandas DataFrame 中每一行的第一个和所有非零值

识别 Pandas DataFrame 中每一行的第一个和所有非零值

临摹微笑 2023-05-23 10:18:01
我有一个类似于以下内容的 Pandas DataFramedata=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  Date50   Juan      0      0    400    450    5001   Luis    100    100    100    100    1002  Maria      0     20     50    300    5003  Laura      0      0      0    100    9004   Lina      0      0      0      0     10我想生成两个单独的数据框。第一个应该在前一个 DataFrame 的非零值的所有位置包含一个 1,即    Name  Date1  Date2  Date3  Date4  Date50   Juan      0      0      1      1      11   Luis      1      1      1      1      12  Maria      0      1      1      1      13  Laura      0      0      0      1      14   Lina      0      0      0      0      1第二个应该在每行的第一个非零值中有一个 1。    Name  Date1  Date2  Date3  Date4  Date50   Juan      0      0      1      0      01   Luis      1      0      0      0      02  Maria      0      1      0      0      03  Laura      0      0      0      1      04   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)有没有更容易/更简单的方法来实现我想要的第一个结果?和有谁知道如何实现第二个结果?(当然还有一个双循环,它逐个比较数字,这是我宁愿避免的蛮力方法)
查看完整描述

1 回答

?
守着一只汪

TA贡献1872条经验 获得超3个赞

首先,您只能选择数字列并用in替换非0值,然后为第二个添加累积总和,比较第一个值和布尔掩码转换为整数:1DataFrame.maskaxis=11DataFrame.eqDataFrame.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


查看完整回答
反对 回复 2023-05-23
  • 1 回答
  • 0 关注
  • 148 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信