Python 用另一个带有groupby的数据帧填充数据帧NaN

Python 用另一个带有groupby的数据帧填充数据帧NaN,python,pandas,merge,Python,Pandas,Merge,我相信这个问题以前已经得到了回答,但我似乎找不到正确的解决办法。我试过pd.merge,merge,combine_first和update,但他们似乎都没有找到合适的工作。它们要么创建一个带有x的新变量,要么在下面暗示堆栈。我希望将df1合并到df中,其中c列缺少值。我希望在每个日期对每个id执行此操作 任务的示例df df date id a b c d 1/1/2000 1 10 20 10 11 1/1/2000 2 1

我相信这个问题以前已经得到了回答,但我似乎找不到正确的解决办法。我试过pd.merge,merge,combine_first和update,但他们似乎都没有找到合适的工作。它们要么创建一个带有x的新变量,要么在下面暗示堆栈。我希望将
df1
合并到
df
中,其中
c
列缺少值。我希望在每个
日期对每个
id
执行此操作

任务的示例
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
  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
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  
组合
df
d1
后所需的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
  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

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

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


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

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


至少在你的例子中,你可以。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

至少在你的例子中,你可以。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

这也是约会。编辑了问题,它也是日期。编辑了问题谢谢你的参与。我已经更新了这个问题,因为
df1
df
的长度不同。当我按照上述步骤操作时,
df
中的列仍然保留empty@oceanbeach96我认为这应该很好。请确保代码中的
df1
替换为
df
,而
df2
替换为
df1
。谢谢您的帮助。我已经更新了这个问题,因为
df1
df
的长度不同。当我按照上述步骤操作时,
df
中的列仍然保留empty@oceanbeach96我认为这应该很好。请确保代码中的
df1
替换为
df
,而
df2
替换为
df1
。谢谢您的帮助。我已经更新了这个问题,因为
df1
df
的长度不同。当我按照上面的步骤操作时,
df
中的列仍然为空,您可以继续。我已经更新了这个问题,因为
df1
df
的长度不同。当我按照上面的步骤操作时,
df
中的列仍然为空