Pandas对多个列进行分组,并根据未分组列中的条件附加值

  • 本文关键字:附加值 条件 Pandas python pandas
  • 更新时间 :
  • 英文 :


我想对数据帧中的几个列进行分组,然后在原始数据帧中附加一个新列,该列的非聚合值由分组之外的另一列中的条件确定。例如:

import pandas as pd
import numpy as np
df = pd.DataFrame({'cat' : ['foo', 'foo', 'foo', 'foo','foo','foo',
'bar', 'bar', 'bar',' bar','bar', 'bar'],
'subcat' : ['a', 'a','a', 'b', 'b', 'b',
'c', 'c','c','d', 'd', 'd'],
'bin' : [1,0,0,0,1,0,0,0,1,0,0,1],
'value':[2,5,7,6,3,9,8,3,2,1,2,4]
})

我想按"cat"one_answers"subcat"进行分组,并希望将相应的"value"附加为一个新列,其中"bin"==1。

这是我想要的输出:

df = pd.DataFrame({'cat' : ['foo', 'foo', 'foo', 'foo','foo','foo',
'bar', 'bar', 'bar',' bar','bar', 'bar'],
'subcat' : ['a', 'a','a', 'b', 'b', 'b',
'c', 'c','c','d', 'd', 'd'],
'bin' : [1,0,0,0,1,0,0,0,1,0,0,1],
'value':[2,5,7,6,3,9,8,3,2,1,2,4],
'new_value':[2,2,2,3,3,3,2,2,2,4,4,4]
})

我尝试了各种方法,包括以下方法,但合并产生的行数比预期的要多,所以我希望找到一条不同的路径。

vals = df[df['bin'] == 1].loc[:,('cat', 'subcat', 'value')]
df_merged = pd.merge(left = df, right = vals,  how = "left", on = ('cat','subcat'))

谢谢!

尝试使用locgroupbyidxmax:

df['new_value'] = df.loc[df.groupby(['subcat'])['bin'].transform('idxmax'), 'value'].reset_index(drop=True)
print(df)

输出:

cat subcat  bin  value  new_value
0    foo      a    1      2          2
1    foo      a    0      5          2
2    foo      a    0      7          2
3    foo      b    0      6          3
4    foo      b    1      3          3
5    foo      b    0      9          3
6    bar      c    0      8          2
7    bar      c    0      3          2
8    bar      c    1      2          2
9    bar      d    0      1          4
10   bar      d    0      2          4
11   bar      d    1      4          4

最新更新