pandas 如何合并列列表中的两个 Dataframe ,然后进行重复数据删除?

aydmsdu9  于 2023-03-11  发布在  其他
关注(0)|答案(1)|浏览(202)

我有两个 Dataframe ,我想在cols = ['male', 'age_cat', 'inpatient']上进行合并,合并后,我想在每个 Dataframe 的左列和右列index上进行重复数据消除。
答:

index  male  age_cat  inpatient
6885   34273   0.0      3.0        1.0
10145  50273   0.0      1.0        0.0
6099   30258   0.0      1.0        0.0
10834  53697   0.0      1.0        0.0
15267  76649   1.0      0.0        0.0
10122  50155   1.0      1.0        0.0
9210   45680   0.0      0.0        0.0
446     2221   1.0      3.0        0.0
38       196   1.0      0.0        0.0
14757  73363   1.0      0.0        0.0
450     2237   0.0      0.0        0.0
9617   47684   0.0      1.0        0.0
5285   26349   0.0      3.0        0.0
5666   28006   0.0      0.0        0.0
487     2475   1.0      2.0        0.0
671     3406   0.0      1.0        0.0
13398  66352   1.0      1.0        0.0
15525  78429   1.0      0.0        0.0
2831   14047   1.0      0.0        0.0
13361  66208   0.0      2.0        0.0

B:

index  male  age_cat  inpatient
99629    99629     0        0          0
39305    39305     1        0          1
168799  168799     1        0          0
25276    25276     0        0          0
9964      9964     1        2          1
5137      5137     1        0          1
158488  158488     1        0          0
94960    94960     0        0          0
8955      8955     0        0          0
190425  190425     0        0          0

所以,我做如下:

mp=a.merge(b, on = cols)

我得到了 Dataframe
议员:

index_x  male  age_cat  inpatient  index_y
0     76649   1.0      0.0        0.0   168799
1     76649   1.0      0.0        0.0   158488
2       196   1.0      0.0        0.0   168799
3       196   1.0      0.0        0.0   158488
4     73363   1.0      0.0        0.0   168799
5     73363   1.0      0.0        0.0   158488
6     78429   1.0      0.0        0.0   168799
7     78429   1.0      0.0        0.0   158488
8     14047   1.0      0.0        0.0   168799
9     14047   1.0      0.0        0.0   158488
10    45680   0.0      0.0        0.0    99629
11    45680   0.0      0.0        0.0    25276
12    45680   0.0      0.0        0.0    94960
13    45680   0.0      0.0        0.0     8955
14    45680   0.0      0.0        0.0   190425
15     2237   0.0      0.0        0.0    99629
16     2237   0.0      0.0        0.0    25276
17     2237   0.0      0.0        0.0    94960
18     2237   0.0      0.0        0.0     8955
19     2237   0.0      0.0        0.0   190425
20    28006   0.0      0.0        0.0    99629
21    28006   0.0      0.0        0.0    25276
22    28006   0.0      0.0        0.0    94960
23    28006   0.0      0.0        0.0     8955
24    28006   0.0      0.0        0.0   190425

这是所期望的。
为了检查预期的配对数,我首先检查特定条件:

In [124]: a[(a.male==1)&(a.age_cat==0)&(a.inpatient==0)]
Out[124]:
       index  male  age_cat  inpatient
15267  76649   1.0      0.0        0.0
38       196   1.0      0.0        0.0
14757  73363   1.0      0.0        0.0
15525  78429   1.0      0.0        0.0
2831   14047   1.0      0.0        0.0

以及

In [125]: b[(b.male==1)&(b.age_cat==0)&(b.inpatient==0)]
Out[125]:
         index  male  age_cat  inpatient
168799  168799     1        0          0
158488  158488     1        0          0

因此,我预计在重复数据消除后最多有两个匹配对,由此产生了我的问题:要对 Dataframe mp中的索引index_xindex_y进行重复数据消除,我尝试了以下方法:

In [126]: mp[(~mp['index_x'].duplicated(keep='first'))&(~mp['index_y'].duplicated(keep='first'))]
Out[126]:
    index_x  male  age_cat  inpatient  index_y
0     76649   1.0      0.0        0.0   168799
10    45680   0.0      0.0        0.0    99629

但是,正如您所看到的,我只得到了male==1, age_cat==0 and inpatient==0的一个示例,而不是预期的两个示例。
我试过其他方法,但效果更差。
我正在合并三个以上的元素, Dataframe 明显要大得多,但问题几乎是一样的。

3b6akqbq

3b6akqbq1#

如果我没理解错的话,您可以在两个 Dataframe 中创建一个临时列(例如tmp),然后通过cols +此列合并 Dataframe :

cols = ['male', 'age_cat', 'inpatient']

df_a['tmp'] = df_a.groupby(cols).cumcount()
df_b['tmp'] = df_b.groupby(cols).cumcount()

mp=df_a.merge(df_b, on = cols + ['tmp'])

print(mp)

图纸:

index_x  male  age_cat  inpatient  tmp  index_y
0    76649   1.0      0.0        0.0    0   168799
1    45680   0.0      0.0        0.0    0    99629
2      196   1.0      0.0        0.0    1   158488
3     2237   0.0      0.0        0.0    1    25276
4    28006   0.0      0.0        0.0    2    94960

相关问题