Python 如何对两个数据帧之间丢失的数据进行计数并应用合并?

Python 如何对两个数据帧之间丢失的数据进行计数并应用合并?,python,pandas,dataframe,Python,Pandas,Dataframe,我试图用丢失的数据填充数据框。我有两个数据帧: df1: df1 = pd.DataFrame({'a':['11','11','11','11','22','22','43','43'], 'x': ['d1', 'd2','d3','d4','d1','d2','d1','d3'], 'b': [1, 2,3,4,5,6,7,8]}) a x b 0 11 d1 1 1 11 d2 2 2 11 d3 3 3 11 d4 4 4 22 d1 5

我试图用丢失的数据填充数据框。我有两个数据帧:

df1:

df1 = pd.DataFrame({'a':['11','11','11','11','22','22','43','43'], 'x': ['d1', 'd2','d3','d4','d1','d2','d1','d3'], 'b': [1, 2,3,4,5,6,7,8]})

    a   x  b
0  11  d1  1
1  11  d2  2
2  11  d3  3
3  11  d4  4
4  22  d1  5
5  22  d2  6
6  43  d1  7
7  43  d3  8

df2:

df2 = pd.DataFrame({'x': ['d1', 'd2','d3','d4']})

    x
0  d1
1  d2
2  d3
3  d4
我试过这样做:

df1.groupby('a', as_index=False).apply(lambda d: d.merge(df2, on='x', how='right')).reset_index(drop=True)
但我的结果是:

      a   x    b
0    11  d1  1.0
1    11  d2  2.0
2    11  d3  3.0
3    11  d4  4.0
4    22  d1  5.0
5    22  d2  6.0
6   NaN  d3  NaN
7   NaN  d4  NaN
8   NaN  d2  NaN
9   NaN  d4  NaN
10   43  d1  7.0
11   43  d3  8.0
我期望的结果是:

     a   x    b
0   11  d1  1.0
1   11  d2  2.0
2   11  d3  3.0
3   11  d4  4.0
4   22  d1  5.0
5   22  d2  6.0
6   22  d3  NaN
7   22  d4  NaN
8   43  d1  7.0
9   43  d2  NaN
10  43  d3  8.0
11  43  d4  NaN
是否可以在我需要的行中填充由
NaN
表示的缺失数据?这样,当我需要在第10行和第11行中使用d2和d4时,我就可以在第8行和第9行中使用d2和d4


我的数据帧大约有150-200行,因此我试图尽可能多地保持这种通用性,以提高性能
groupby
合并
不是一个好主意。更好的方法是使用
a
x
列的所有可能组合创建
multi-index
,并使用:

然后,如果需要通过
b
列中的缺失值来设置
a
,并通过
a
将其设置到组末,请使用:

df = (df.assign(tmp = df['b'].isna())
        .sort_values(['a','tmp'])
        .assign(a = lambda x: x['a'].mask(x['b'].isna()))
        .drop('tmp', axis=1))

print (df)
      a   x    b
0    11  d1  1.0
1    11  d2  2.0
2    11  d3  3.0
3    11  d4  4.0
4    22  d1  5.0
5    22  d2  6.0
6   NaN  d3  NaN
7   NaN  d4  NaN
8    43  d1  7.0
10   43  d3  8.0
9   NaN  d2  NaN
11  NaN  d4  NaN

我可能不完全理解这个问题,连接是否应该更像:

      a   x    b
0    11  d1  1.0
1    11  d2  2.0
2    11  d3  3.0
3    11  d4  4.0
4    22  d1  5.0
5    22  d2  6.0
6   NaN  d3  NaN
7   NaN  d4  NaN
8    43  d1  7.0
9   NaN  d2  NaN
10   43  d3  8.0
11  NaN  d4  NaN
这是我从你的代码中得到的:

import pandas as pd

df1 = pd.DataFrame({'a':['11','11','11','11','22','22','43','43'], 'x': ['d1', 'd2','d3','d4','d1','d2','d1','d3'], 'b': [1, 2,3,4,5,6,7,8]})
df2 = pd.DataFrame({'x': ['d1', 'd2','d3','d4']})

print(df1.groupby('a', as_index=False).apply(lambda d: d.merge(df2, on='x', how='right')).reset_index(drop=True))
结果:

[Running] python -u "c:\MyProjects\~python\pandas\dframe.py"
      a   x    b
0    11  d1  1.0
1    11  d2  2.0
2    11  d3  3.0
3    11  d4  4.0
4    22  d1  5.0
5    22  d2  6.0
6   NaN  d3  NaN
7   NaN  d4  NaN
8    43  d1  7.0
9   NaN  d2  NaN
10   43  d3  8.0
11  NaN  d4  NaN

你的第一个答案非常适合:mux=pd.MultiIndex.from_product([df1['a'].unique(),df2['x']],names=['a','x'])df=df1.set_index(['a','x'])reindex(mux).reset_index(),我们可以在聊天中讨论这方面的改进吗?@GABRIELANDRADEQUEIROZ-我认为最好是提出新问题。
[Running] python -u "c:\MyProjects\~python\pandas\dframe.py"
      a   x    b
0    11  d1  1.0
1    11  d2  2.0
2    11  d3  3.0
3    11  d4  4.0
4    22  d1  5.0
5    22  d2  6.0
6   NaN  d3  NaN
7   NaN  d4  NaN
8    43  d1  7.0
9   NaN  d2  NaN
10   43  d3  8.0
11  NaN  d4  NaN