gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:22:09 24 4
gpt4 key购买 nike

我有一个类似于以下内容的 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值(value)来自 1 DataFrame.mask ,然后第二次添加每 axis=1 的累积和与先比较 1值来自 DataFrame.eq 和 bool 掩码通过 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

关于python - 识别 Pandas DataFrame 中每一行的第一个和所有非零值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63423586/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com