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

我确信以前已经回答过这个问题,但我似乎找不到正确的解决方案。我尝试过 pd.merge、merge、combine_first 和 update,但它们似乎都没有得到正确的工作。他们要么用 _x 创建一个新变量,要么在下面暗示堆栈。我希望合并df1到列缺少值的df位置。我希望对每个人都c这样做iddate


df任务示例


df


  date     id    a    b   c     d

1/1/2000    1   10   20   10   11

1/1/2000    2   11   21   NaN  11

1/1/2000    3   15   20   NaN  11

1/1/2000    4   12   24   13   11

1/2/2000    1   10   25   10   11

1/2/2000    2   10   20   NaN  15

1/2/2000    3   10   26   NaN  11

1/2/2000    4   10   20   16   13

1/3/2000    1   10   20   10   11

1/3/2000    2   10   20   NaN  11

1/3/2000    3   10   20   NaN  11

1/3/2000    4   10   20   10   11

df1


 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和d1


df


  date     id    a    b   c     d

1/1/2000    1   10   20   10   11

1/1/2000    2   11   21   1    11

1/1/2000    3   15   20   14   11

1/1/2000    4   12   24   13   11

1/2/2000    1   10   25   10   11

1/2/2000    2   10   20   13   15

1/2/2000    3   10   26   22   11

1/2/2000    4   10   20   16   13

1/3/2000    1   10   20   10   11

1/3/2000    2   10   20   13   11

1/3/2000    3   10   20   18   11

1/3/2000    4   10   20   10   11


LEATH
浏览 82回答 2
2回答

婷婷同学_

MultiIndex让我们在数据框中创建一个id和date列,然后使用中的相应值Series.fillna填充NaN列中c的值:df1df2df1['c'] = df1.set_index(['date', 'id'])['c']\              .fillna(df2.set_index(['id', 'date'])['c']).tolist()        date  id   a   b     c   d0   1/1/2000   1  10  20  10.0  111   1/1/2000   2  11  21   1.0  112   1/1/2000   3  15  20  14.0  113   1/1/2000   4  12  24  13.0  114   1/2/2000   1  10  25  10.0  115   1/2/2000   2  10  20  13.0  156   1/2/2000   3  10  26  22.0  117   1/2/2000   4  10  20  16.0  138   1/3/2000   1  10  20  10.0  119   1/3/2000   2  10  20  13.0  1110  1/3/2000   3  10  20  18.0  1111  1/3/2000   4  10  20  10.0  11

慕妹3146593

至少在您的示例中,您可以从值列表中填充 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   d0   1/1/2000   1  10  20  10.0  111   1/1/2000   2  11  21   1.0  112   1/1/2000   3  15  20  14.0  113   1/1/2000   4  12  24  13.0  114   1/2/2000   1  10  25  10.0  115   1/2/2000   2  10  20  13.0  156   1/2/2000   3  10  26  22.0  117   1/2/2000   4  10  20  16.0  138   1/3/2000   1  10  20  10.0  119   1/3/2000   2  10  20  13.0  1110  1/3/2000   3  10  20  18.0  1111  1/3/2000   4  10  20  10.0  11
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python