提问人:Reshma Ahmed 提问时间:11/16/2023 最后编辑:Reshma Ahmed 更新时间:11/16/2023 访问量:39
根据 pandas 中从一个 df 到另一个 df 的条件插补缺失值
Imputing missing values based on conditions from one df to another in pandas
问:
我有 2 个数据帧,df1 和 df2。我需要将 df1 中的值添加到 df2。它们都有不同的索引 - 并且 df1 是通过 groupby 和某个第 3 个数据帧的平均值计算的。我想使用apply函数或任何我可以重用的东西,因为这种情况存在于我的输出数据帧的多个列中。
假设 df1 是我的第一个 df,df2 是我的第二个 df,
如果 df2.column.row_value 为 null/na:来自 df1.avg2 的插补值,其中 df1 的名称 = df2 的名称 否则,如果 avg2 列中的 df2.column.row_value 为 null,则插补 df1.avg3 中的值,其中 df1 集与 df2 集相同 否则插补 0.000
输入:
df1={'name_set' :['aa_001','bb_002','cc_003','aa_002','aa_001','cc_002'], 'name':['aa','bb','cc','aa','aa','cc'], 'set':['001','002','003','002','001','002'], 'avg1(groupby name_set)':[2,3,nan,1,2,nan], 'avg2(groupby name)':[3,2,nan,3,3,1], 'avg3(groupby set)':[2,3,1,3,2,3]}
df2 = {'name_set' :['aa_001','bb_002','cc_003','aa_002','aa_001','cc_002'], 'name':['aa','bb','cc','aa','aa','cc'], 'set':['001','002','003','002','001','002'], 'data1':[2,3,nan,1,2,nan]}
预期输出:
{'name_set' :['aa_001','bb_002','cc_003','aa_002','aa_001','cc_002'],
'name':['aa','bb','cc','aa','aa','cc'],
'set':['001','002','003','002','001','002'],
'data1':[2,3, 1, # (should be imputed from df1.avg3 where df1.set=df2.set)
1,2, 1 # (should be imputed from df1.avg2 where df1.name=df2.name
]}
两个 DataFrame 的索引不同。
请帮我解决这个问题,因为我是熊猫的新手。
答:
0赞
Panda Kim
11/16/2023
#1
法典
out = df2.merge(df1.drop_duplicates('name_set'), how='left')\
.assign(data1=lambda x: x['data1'].fillna(x['avg2(groupby name)'])\
.fillna(x['avg3(groupby set)']))\
.iloc[:, :4]
外:
name_set name set data1
0 aa_001 aa 001 2.0
1 bb_002 bb 002 3.0
2 cc_003 cc 003 1.0
3 aa_002 aa 002 1.0
4 aa_001 aa 001 2.0
5 cc_002 cc 002 1.0
我希望您不要在示例中使列名过长。
评论