我想在pandas数据框中设置一个新列,其值使用dataframe2上的groupby计算。
DF1:
col1 col2
id
1 'a'
2 'b'
3 'c'
DF2:
id col2
index
1 1 11
1 1 22
1 1 12
1 1 45
3 3 83
3 3 11
3 3 35
3 3 54
我想用'id'对DF2进行分组,然后在'col2'上应用一个函数将结果放入DF1中的相应索引。如果该特定索引没有组,那么我想填写NaN ...
ret_val = DF2.groupby('id').apply(lambda x: my_func(x['col_2']))
col1 col2
id
1 'a' ret_val
2 'b' NaN
3 'c' ret_val
......我无法弄清楚如何实现这个目标
答案 0 :(得分:2)
在map
系列上使用df1.index
。
In [5327]: df1['col2'] = df1.index.to_series().map(df2.groupby('id')
.apply(lambda x: my_func(x['col2'])))
In [5328]: df1
Out[5328]:
col1 col2
id
1 a 360.0
2 b NaN
3 c 536.0
详细
In [5322]: def my_func(x):
...: return x.sum()
...:
In [5323]: df2.groupby('id').apply(lambda x: my_func(x['col2']))
Out[5323]:
id
1 360.0
3 536.0
dtype: float64
In [5324]: df1.index.to_series().map(df2.groupby('id').apply(lambda x: my_func(x['col2'])))
Out[5324]:
id
1 360.0
2 NaN
3 536.0
Name: id, dtype: float64
答案 1 :(得分:1)
首先在df2的col2上应用该函数,然后使用pd.concat
在df中删除col2
,因为它是空的。
x = df2.groupby('id')['col2'].apply(sum) # instead of sum use your own function
ndf = pd.concat([df.drop('col2',1),x],1)
col1 col2 id 1 'a' 90.0 2 'b' NaN 3 'c' 183.0
@Zero建议直接和简单
df1['col2'] = df2.groupby('id')['col2'].apply(sum)
答案 2 :(得分:1)
您可以将sum
替换为.apply(lambda x : your_func(x))
df1.col2=df.set_index('id').groupby(level='id').sum()
df1
Out[975]:
col1 col2
id
1 'a' 90.0
2 'b' NaN
3 'c' 183.0