识别由熊猫中的多个列组成的组中的第一个非零元素

时间:2018-09-01 19:33:54

标签: python python-3.x pandas numpy

我有一个如下所示的数据框。最右边的列是我想要的列:

Group1  Group2  Value   Target_Column
1        3         0      0
1        3         1      1
1        4         1      1
1        4         1      0
2        5         5      5
2        5         1      0
2        6         0      0
2        6         1      1
2        6         9      0

如何识别由两列(Group1Group2)组成的组中的第一个非零值,然后创建一个显示第一个非零值的列,并将其他所有内容都显示为零?

这个问题与前面提出的问题非常相似: Identify first non-zero element within a group in pandas 但是该解决方案会导致基于多列的组出现错误。

我尝试过:

import pandas as pd
dt = pd.DataFrame({'Group1': [1,1,1,1,2,2,2,2,2], 'Group2': [3,3,4,4,5,5,6,6,6],  'Value': [0,1,1,1,5,1,0,1,9]})
dt['Newcol']=0
dt.loc[dt.Value.ne(0).groupby(dt['Group1','Group2']).idxmax(),'Newcol']=dt.Value

2 个答案:

答案 0 :(得分:1)

设置

df['flag'] = df.Value.ne(0)

使用numpy.whereassign

df.assign(
    target=np.where(df.index.isin(df.groupby(['Group1', 'Group2']).flag.idxmax()),
    df.Value, 0)
).drop('flag', 1)

使用locassign

df.assign(
    target=df.loc[df.groupby(['Group1', 'Group2']).flag.idxmax(), 'Value']
).fillna(0).astype(int).drop('flag', 1)

两种产品:

   Group1  Group2  Value  target
0       1       3      0       0
1       1       3      1       1
2       1       4      1       1
3       1       4      1       0
4       2       5      5       5
5       2       5      1       0
6       2       6      0       0
7       2       6      1       1
8       2       6      9       0

答案 1 :(得分:1)

数字可能不正确,因为只有两个相同的值时,我不知道您需要哪个。

使用user3483203的设置

df['flag'] = df.Value.ne(0)

df['Target']=df.sort_values(['flag'],ascending=False).drop_duplicates(['Group1','Group2']).Value

df['Target'].fillna(0,inplace=True)
df
Out[20]: 
   Group1  Group2  Value  Target_Column  Target
0       1       3      0              0     0.0
1       1       3      1              1     1.0
2       1       4      1              1     1.0
3       1       4      1              0     0.0
4       2       5      5              5     5.0
5       2       5      1              0     0.0
6       2       6      0              0     0.0
7       2       6      1              1     1.0