识别 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)

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


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


临摹微笑
浏览 182回答 1
1回答

守着一只汪

首先,您只能选择数字列并用in替换非0值,然后为第二个添加累积总和,比较第一个值和布尔掩码转换为整数:1DataFrame.maskaxis=11DataFrame.eqDataFrame.astypedf1, df2 = data.copy(), data.copy()cols = df1.select_dtypes(include=np.number).columnsdf1[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  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      1print(df2)    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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python