在 pandas DataFrame1 中设置新列值,其中 DF2 列值与 DF1 索引匹配
Set new column values in pandas DataFrame1 where DF2 column values match DF1 index
我想在 pandas 数据框中设置一个新列,其中的值使用数据框 2 上的 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
...虽然我不太明白如何实现这一点
在 df1.index
系列上使用 map
。
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
首先在 df2 的第 2 列应用函数,然后使用 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)
您可以将 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
我想在 pandas 数据框中设置一个新列,其中的值使用数据框 2 上的 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
...虽然我不太明白如何实现这一点
在 df1.index
系列上使用 map
。
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
首先在 df2 的第 2 列应用函数,然后使用 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)
您可以将 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