基于组和列值在行上连接Pandas数据框架

hts6caw3  于 2023-05-12  发布在  其他
关注(0)|答案(2)|浏览(124)

我有一个这样的Pandas DataFrame:

df = pd.DataFrame({'GROUP':['A1', 'A1', 'B2', 'B2', 'B2', 'C3', 'C3'], 'X':[1, -1, -1, 1, -1, -1, 1], 'Y': [-1, 0, 1, -1, -1, -1, -1], 'Z': [-1, -1, -1, -1, 0, 1, -1]})
df
      GROUP     X     Y     Z
0        A1     1    -1    -1
1        A1    -1     0    -1   
2        B2    -1     1    -1
3        B2     1    -1    -1
4        B2    -1    -1     0  
5        C3    -1    -1     1
6        C3     1    -1    -1

我想通过GROUP有条件地连接每个组的df,这样它将列中的值连接为1或0(两个优先级相同),如果组在那里,则连接为-1。
预期结果:

GROUP     X     Y     Z
0        A1     1     0    -1
1        B2     1     1     0
2        C3     1    -1     1
dxxyhpgq

dxxyhpgq1#

如果每个组始终只有一个01,则聚合max

out = df.groupby('GROUP', as_index=False).max()
print (out)
  GROUP  X  Y  Z
0    A1  1  0 -1
1    B2  1  1  0
2    C3  1 -1  1

如果每组01都有优先级,并且0具有更高的优先级,则可以用途:

df = pd.DataFrame({'GROUP':['A1', 'A1', 'B2', 'B2', 'B2', 'C3', 'C3'],
                   'X':[1, 0, -1, 1, -1, -1, 1],
                   'Y': [-1, 0, 1, -1, -1, -1, -1], 
                   'Z': [-1, -1, -1, -1, 0, 1, -1]})
print (df)
  GROUP  X  Y  Z
0    A1  1 -1 -1
1    A1  0  0 -1
2    B2 -1  1 -1
3    B2  1 -1 -1
4    B2 -1 -1  0
5    C3 -1 -1  1
6    C3  1 -1 -1

df1 = df.groupby('GROUP').max().mask(df.groupby('GROUP').min().eq(0), 0).reset_index()
print (df1)
  GROUP  X  Y  Z
0    A1  0  0 -1
1    B2  1  1  0
2    C3  1 -1  1
sirbozc5

sirbozc52#

由于10都大于-1,因此您可以简单地使用max来获得所需的结果:

df.groupby('GROUP', as_index=False).max()

输出:

GROUP  X  Y  Z
0    A1  1  0 -1
1    B2  1  1  0
2    C3  1 -1  1

相关问题