根据 pandas 中从一个 df 到另一个 df 的条件插补缺失值

Imputing missing values based on conditions from one df to another in pandas

提问人:Reshma Ahmed 提问时间:11/16/2023 最后编辑:Reshma Ahmed 更新时间:11/16/2023 访问量:39

问:

我有 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 的索引不同。

请帮我解决这个问题,因为我是熊猫的新手。

python-3.x pandas 适用

评论

0赞 Panda Kim 11/16/2023
为什么我应该不上传代码数据图像,您可以提供输入的代码或文本吗?
0赞 Reshma Ahmed 11/16/2023
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,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]}
0赞 Reshma Ahmed 11/16/2023
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]}
0赞 Reshma Ahmed 11/16/2023
所需输出: {'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(应从 df1.avg3 插补,其中 df1.set=df2.set) ,1,2, 1 (应从 df1.avg2 插补,其中 df1.name=df2.name]}
0赞 Panda Kim 11/16/2023
字符串缺少引号,因此无法重现。我试图通过纠正它来重现它,但这样的情况太多了。

答:

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

我希望您不要在示例中使列名过长。