连接具有不同数量的多索引级别的两个数据框

时间:2019-08-08 14:42:25

标签: python pandas dataframe

我想加入两个DataFrame,其中一个(df1)具有三级多索引,而另一个Dataframe(df2)具有相同的索引和一个额外索引。两者都有一列值。

我想合并这些。我已经知道如何。 但是还有一个问题:df2不如df1长。

一个例子:

>>> df1

                        No. individuals        
Year    Age     School   
2000    6       'A'     798
2000    6       'B'     7398
2000    7       'A'     348
2000    7       'B'     528
2000    8       'A'     9158
2000    8       'B'     423
2005    6       'A'     592
2005    6       'B'     455
2005    7       'A'     4566
2005    7       'B'     789
2005    8       'A'     212
2005    8       'B'     78
2010    6       'A'     532
2010    6       'B'     654
2010    7       'A'     4222
2010    7       'B'     724
2010    8       'A'     224
2010    8       'B'     153


>>> df2
                                Avg. Grades        
Year    Age     School  Class 
2000    6       'A'     'x'     5.3
2000    6       'A'     'y'     3.3
2000    6       'B'     'x'     8.1
2000    6       'B'     'y'     4.4
2000    7       'A'     'x'     1.4
2000    7       'A'     'y'     5.3
2000    7       'B'     'x'     1.2
2000    7       'B'     'y'     6.3
2000    8       'A'     'x'     9.2
2000    8       'A'     'y'     0.9
2000    8       'B'     'x'     0.1
2000    8       'B'     'y'     2.2
2005    6       'A'     'x'     5.9
2005    6       'A'     'y'     1.0
2005    6       'B'     'x'     4.0
2005    6       'B'     'y'     1.0
2005    7       'A'     'x'     4.0
2005    7       'A'     'y'     5.0
2005    7       'B'     'x'     6.0
2005    7       'B'     'y'     7.9
2005    8       'A'     'x'     7.0
2005    8       'A'     'y'     3.0
2005    8       'B'     'x'     9.0
2005    8       'B'     'y'     1.9

df2是比df1多的索引级别。因此,合并这些课程时,'x'级和'y'级的每年,年龄和学校中的人数应该相同。

如果我删除了year=2010中所有df1的行,我就做到了。我通过以下方式加入了他们:

result = df2.join(df1, on='Year','Age','School'],how='left')
>>> result
                                Avg. Grades     No. individuals   
Year    Age     School  Class 
2000    6       'A'     'x'     5.3             798
2000    6       'A'     'y'     3.3             798
2000    6       'B'     'x'     8.1             7398
2000    6       'B'     'y'     4.4             7398
2000    7       'A'     'x'     1.4             348
2000    7       'A'     'y'     5.3             348
2000    7       'B'     'x'     1.2             528
2000    7       'B'     'y'     6.3             528
2000    8       'A'     'x'     9.2             9158
2000    8       'A'     'y'     0.9             9158
2000    8       'B'     'x'     0.1             423
2000    8       'B'     'y'     2.2             423
2005    6       'A'     'x'     5.9             592
2005    6       'A'     'y'     1.0             592
2005    6       'B'     'x'     4.0             455
2005    6       'B'     'y'     1.0             455
2005    7       'A'     'x'     4.0             4566
2005    7       'A'     'y'     5.0             4566
2005    7       'B'     'x'     6.0             789
2005    7       'B'     'y'     7.9             789
2005    8       'A'     'x'     7.0             212
2005    8       'A'     'y'     3.0             212
2005    8       'B'     'x'     9.0             78
2005    8       'B'     'y'     1.9             78

但是我想保留df1year==2010处的行。由于df2上没有行,因此我希望Avg. Gradesdf2和{中的year==2005的{​​{1}}与Age保持恒定{1}}。

也就是说:

School

我知道,我可以只对Class的2005年部分进行切片,然后将年份替换为2010年,然后附加在>>> expected Avg. Grades No. individuals Year Age School Class 2000 6 'A' 'x' 5.3 798 2000 6 'A' 'y' 3.3 798 2000 6 'B' 'x' 8.1 7398 2000 6 'B' 'y' 4.4 7398 2000 7 'A' 'x' 1.4 348 2000 7 'A' 'y' 5.3 348 2000 7 'B' 'x' 1.2 528 2000 7 'B' 'y' 6.3 528 2000 8 'A' 'x' 9.2 9158 2000 8 'A' 'y' 0.9 9158 2000 8 'B' 'x' 0.1 423 2000 8 'B' 'y' 2.2 423 2005 6 'A' 'x' 5.9 592 2005 6 'A' 'y' 1.0 592 2005 6 'B' 'x' 4.0 455 2005 6 'B' 'y' 1.0 455 2005 7 'A' 'x' 4.0 4566 2005 7 'A' 'y' 5.0 4566 2005 7 'B' 'x' 6.0 789 2005 7 'B' 'y' 7.9 789 2005 8 'A' 'x' 7.0 212 2005 8 'A' 'y' 3.0 212 2005 8 'B' 'x' 9.0 78 2005 8 'B' 'y' 1.9 78 2010 6 'A' 'x' 5.9 532 2010 6 'A' 'y' 1.0 532 2010 6 'B' 'x' 4.0 654 2010 6 'B' 'y' 1.0 654 2010 7 'A' 'x' 4.0 4222 2010 7 'A' 'y' 5.0 4222 2010 7 'B' 'x' 6.0 724 2010 7 'B' 'y' 7.9 724 2010 8 'A' 'x' 7.0 224 2010 8 'A' 'y' 3.0 224 2010 8 'B' 'x' 9.0 153 2010 8 'B' 'y' 1.9 153 上。但是,我尝试合并的实际DataFrame大得多,我必须将切片附加到df2 80次,我确实需要高效。我已经做到了,大约花了时间。只需1分钟。

我希望你们中的一个能帮助我。

谢谢。

0 个答案:

没有答案