繁体   English   中英

如何基于另一个数据框的值将更改应用于pandas groupby?

[英]How to apply changes to pandas groupby based on values from another dataframe?

我有一个3列的pandas groupby系列,我想根据另一个pandas数据框的值在第三列进行更改

Data1                               Data2(unique names)

name    col1    col2                name   col
a       10      -0.2                x      0.002
b       80      0.3                 a      0.004
a       72      1.1                 b      0.007
a       54      0.8                 ... 
b       90     -3.2

创建熊猫数据框

df1 = pd.DataFrame.from_dict(Data1)
df2 = pd.DataFrame.from_dict(Data2)

并按第一个数据框分组

df1Groupby = df1.groupby(df1.keys()[0])

使用与df1中相同的名称获取df2中的行

common = {}
for i in df2[df2.keys()[0]]:
    if i in df1[df1.keys()[0]].unique():
        common[i] = df2[df2.keys()[0]==i][df2.keys()[1]].values
dfcommon = pd.DataFrame.from_dict(common)

现在我想为每个名称更改Data1中的col2为

col2 = col2 + col1 * col

定义功能

def my_func(group, amt):
    group[group.keys()[2]] = group[group.keys()[2]] + group[group.keys()[1]] * amt
    return group

然后在主调用函数中

for i in dfcommon.index:
    df1Groupby.get_group(i).apply(my_func, dfcommon.loc[i].values[0],axis=1)

但是我得到以下错误

TypeError:apply()为参数'axis'获得了多个值

不知道我的方法是否正确,将不胜感激。

这很简单,就像使用pandas.Series.map一样 您将在“名称”和“ col”之间创建映射。 在这种情况下,您不需要“合并”(联接)两个数据帧,因为您只想从第二个数据帧中检索一个值。

# create a mapper
mapper = Data2.set_index('name')['col']
mapped_value = Data1['name'].map(mapper)

# crete new column
data1['new_column'] = data1['col1'] + data1['col2'] * mapped_value

希望这是您要实现的目标。 如果没有,请提供更多详细信息和所需的输出!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM