在pandas DataFrame1中设置新列值,其中DF2列值与DF1索引匹配

时间:2017-10-23 16:03:25

标签: python pandas pandas-groupby

我想在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

......我无法弄清楚如何实现这个目标

3 个答案:

答案 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