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

使用 groupby 用另一个 DataFrame 填充 DataFrame NaN

使用 groupby 用另一个 DataFrame 填充 DataFrame NaN

LEATH 2023-10-26 10:49:23
我确信以前已经回答过这个问题,但我似乎找不到正确的解决方案。我尝试过 pd.merge、merge、combine_first 和 update,但它们似乎都没有得到正确的工作。他们要么用 _x 创建一个新变量,要么在下面暗示堆栈。我希望合并df1到列缺少值的df位置。我希望对每个人都c这样做iddatedf任务示例df  date     id    a    b   c     d1/1/2000    1   10   20   10   111/1/2000    2   11   21   NaN  111/1/2000    3   15   20   NaN  111/1/2000    4   12   24   13   111/2/2000    1   10   25   10   111/2/2000    2   10   20   NaN  151/2/2000    3   10   26   NaN  111/2/2000    4   10   20   16   131/3/2000    1   10   20   10   111/3/2000    2   10   20   NaN  111/3/2000    3   10   20   NaN  111/3/2000    4   10   20   10   11df1 date         id   c    12/29/1999    2   1  12/30/1999    3   1  12/30/1999    2   1  12/31/1999    3   1  12/31/1999    2   1  12/31/1999    4   1  1/1/2000      2   1  1/1/2000      3   14  1/2/2000      2   13  1/2/2000      3   22  1/3/2000      2   13  1/3/2000      3   18  组合后所需的 dfdf和d1df  date     id    a    b   c     d1/1/2000    1   10   20   10   111/1/2000    2   11   21   1    111/1/2000    3   15   20   14   111/1/2000    4   12   24   13   111/2/2000    1   10   25   10   111/2/2000    2   10   20   13   151/2/2000    3   10   26   22   111/2/2000    4   10   20   16   131/3/2000    1   10   20   10   111/3/2000    2   10   20   13   111/3/2000    3   10   20   18   111/3/2000    4   10   20   10   11
查看完整描述

2 回答

?
婷婷同学_

TA贡献1844条经验 获得超8个赞

MultiIndex让我们在数据框中创建一个id和date列,然后使用中的相应值Series.fillna填充NaN列中c的值:df1df2


df1['c'] = df1.set_index(['date', 'id'])['c']\

              .fillna(df2.set_index(['id', 'date'])['c']).tolist()

        date  id   a   b     c   d

0   1/1/2000   1  10  20  10.0  11

1   1/1/2000   2  11  21   1.0  11

2   1/1/2000   3  15  20  14.0  11

3   1/1/2000   4  12  24  13.0  11

4   1/2/2000   1  10  25  10.0  11

5   1/2/2000   2  10  20  13.0  15

6   1/2/2000   3  10  26  22.0  11

7   1/2/2000   4  10  20  16.0  13

8   1/3/2000   1  10  20  10.0  11

9   1/3/2000   2  10  20  13.0  11

10  1/3/2000   3  10  20  18.0  11

11  1/3/2000   4  10  20  10.0  11


查看完整回答
反对 回复 2023-10-26
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

至少在您的示例中,您可以从值列表中填充 NA 值(无需索引)。AKA, df1, 的长度始终与缺失值的数量相同:


df = df.reset_index(drop=True)

df1 = df.reset_index(drop=True)

df.loc[df['c'].isna(), 'c'] = list(df1['c'])

结果:


        date  id   a   b     c   d

0   1/1/2000   1  10  20  10.0  11

1   1/1/2000   2  11  21   1.0  11

2   1/1/2000   3  15  20  14.0  11

3   1/1/2000   4  12  24  13.0  11

4   1/2/2000   1  10  25  10.0  11

5   1/2/2000   2  10  20  13.0  15

6   1/2/2000   3  10  26  22.0  11

7   1/2/2000   4  10  20  16.0  13

8   1/3/2000   1  10  20  10.0  11

9   1/3/2000   2  10  20  13.0  11

10  1/3/2000   3  10  20  18.0  11

11  1/3/2000   4  10  20  10.0  11


查看完整回答
反对 回复 2023-10-26
  • 2 回答
  • 0 关注
  • 77 浏览
慕课专栏
更多

添加回答

举报

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