【问题标题】:Identify the first and all non-zero values in every row in Pandas DataFrame识别 Pandas DataFrame 中每一行中的第一个和所有非零值
【发布时间】:2020-08-15 15:30:59
【问题描述】:

我有一个类似于以下的 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)

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

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

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    首先,您可以仅选择数字列并将非0 值替换为DataFrame.mask 中的1,然后第二次添加每个axis=1 的累积总和,并将第一个1 值与DataFrame.eq 和布尔值进行比较掩码通过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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-11
      • 2019-12-26
      • 1970-01-01
      • 2014-04-19
      • 2021-12-27
      • 1970-01-01
      • 2014-08-13
      • 2021-06-18
      相关资源
      最近更新 更多