为了账号安全,请及时绑定邮箱和手机立即绑定

pandas:根据另一列用重复值填充 nan 值

pandas:根据另一列用重复值填充 nan 值

千巷猫影 2021-08-14 21:19:25
我有两个要合并的表df_a和df_b,但都缺少一些值。合并进行得很好,但是我试图加快NaN合并后填充值的过程。数据:df_a = pd.DataFrame(data={    'id': [1, 2, 3, 1, 6, 5, 3],    'name': [np.nan, 'two', 'three', 'one', np.nan, np.nan, np.nan],    'length': ['l1', 'l2', 'l3', 'l1', 'l6', np.nan, np.nan],    'Q1': [11, 22, 33, 11, 66, 55, 33],    'Q2': [111, 222, 333, 111, 666, 555, 333]})df_b = pd.DataFrame(data={    'id': [5, 2, 4, 1, 3, 1, 7, 3],    'name': ['five', 'two', 'four', 'one_extra', 'three', 'one', 'seven', 'three'],    'length': ['l5', 'l2', 'l4', 'l1', 'l3', 'l1', 'l7', 'l3_extra'],    'Q1': [2055, 2022, 2044, 2011, 2033, 2011, 2077, 2033],    'Q2': [2055, 2022, 2044, 2011, 2033, 2011, 2077, 2033]})df_m = df_a.merge(df_b, on=['id', 'name', 'length'], how='outer',                  suffixes=['_a', '_b'])Output:       id   name length  Q1   Q2    0   1    NaN     l1  11  111    1   2    two     l2  22  222    2   3  three     l3  33  333    3   1    one     l1  11  111    4   6    NaN     l6  66  666    5   5    NaN    NaN  55  555    6   3    NaN    NaN  33  333       id       name    length    Q1    Q2    0   5       five        l5  2055  2055    1   2        two        l2  2022  2022    2   4       four        l4  2044  2044    3   1  one_extra        l1  2011  2011    4   3      three        l3  2033  2033    5   1        one        l1  2011  2011    6   7      seven        l7  2077  2077    7   3      three  l3_extra  2033  2033我实际上试图合并的两个表要复杂得多,因此上面的示例导致比在那里看到的更奇怪的行为。有超过 100 列,不同的列可以NaN在不同的地方有值。
查看完整描述

2 回答

?
叮当猫咪

TA贡献1776条经验 获得超12个赞

问题是您需要同时执行 a ffill+bfill分组。您当前的矢量化尝试ffill仅执行分组。


res = df_m.sort_values('id')\

          .groupby('id').apply(lambda x: x.ffill().bfill())\

          .drop_duplicates()


print(res)


    id       name    length  Q1_a   Q2_a    Q1_b    Q2_b

0    1        one        l1  11.0  111.0  2011.0  2011.0

9    1  one_extra        l1  11.0  111.0  2011.0  2011.0

1    2        two        l2  22.0  222.0  2022.0  2022.0

2    3      three        l3  33.0  333.0  2033.0  2033.0

11   3      three  l3_extra  33.0  333.0  2033.0  2033.0

8    4       four        l4   NaN    NaN  2044.0  2044.0

5    5       five        l5  55.0  555.0  2055.0  2055.0

4    6        NaN        l6  66.0  666.0     NaN     NaN

10   7      seven        l7   NaN    NaN  2077.0  2077.0


查看完整回答
反对 回复 2021-08-14
  • 2 回答
  • 0 关注
  • 166 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信