标识数据帧中每行中的第一个和所有非零值

2024-05-03 03:26:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个类似于下面的数据框架

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

我想生成两个独立的数据帧。第一个应在前一个数据帧的非零值的所有位置包括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)

有没有更简单的方法来实现我想要的第一个结果?及

有人知道如何实现第二个结果吗?(当然,还有一个双循环,一个数字一个数字地比较,这是我宁愿避免的暴力方法)


Tags: 数据namedataout帖子juanluismaria
1条回答
网友
1楼 · 发布于 2024-05-03 03:26:11

对于第一种情况,您可以只选择数值列,并在^{}中用1替换非0值,然后对于第二种情况,使用^{}比较第一个1值和^{}转换为整数的布尔掩码,添加每axis=1的累积和:

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

相关问题 更多 >