看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
在本例中,我们将两个 DataFrame 合并时,遇到结构不一样的情况如何处理。我们知道,如果两个 DataFrame 相加时会按标签做相量操作,如果标签无法完全对齐时,会只将对齐的部分相加,对于未对齐的需要我们做一些额外的处理。
假定我们有以下两个 DataFrame 数据:
import pandas as pd
df1 = pd.DataFrame({'a':[1,2], 'b':[3,4]}, index=['c1','c2'])
df2 = pd.DataFrame({'a':[1,2], 'b':[3,4]}, index=['c2','c3'])
df1
'''
a b
c1 1 3
c2 2 4
'''
df2
'''
a b
c2 1 3
c3 2 4
'''
我们的需求是将两个 DataFrame 合并,共有的索引标签 c2 行的值相加,非共有的 c1、c3 保持原值。
结果即:
'''
a b
c1 1 3
c2 3 7
c3 2 4
'''
由于直接相加未对齐的结果 NaN:
df1 + df2
'''
a b
c1 NaN NaN
c2 3.0 7.0
c3 NaN NaN
'''
因此我们可以通过以下几种方法来解决:
第一个方法:
df1.add(df2, fill_value=0).astype(int)
'''
a b
c1 1 3
c2 3 7
c3 2 4
'''
第二个方法:
(
(df1 + df2)
.combine_first(df1)
.combine_first(df2)
.astype(int)
)
'''
a b
c1 1 3
c2 3 7
c3 2 4
'''
第三个方法:
(
(df1 + df2)
.fillna(df1)
.fillna(df2)
.astype(int)
)
'''
a b
c1 1 3
c2 3 7
c3 2 4
'''
第四个方法:
(
df1.combine(df2, lambda s1, s2: s1+s2, fill_value=0)
.astype(int)
)
'''
a b
c1 1 3
c2 3 7
c3 2 4
'''
通过以上多种方法,我们可以更加深入理解这些方法的功能,同时也完成了我们的需求。
(完)
更新时间:Aug. 18, 2024, 4:07 p.m. 标签:pandas python dataframe 合并