看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
本需求是两个相同结构的 DataFrame,相同结构是指它们的列数和列名相同,需求要求将两个数据按照指定的两个列为基准,将对应位置相加,得到最终的结果。
我们构造两个数据如下:
import pandas as pd
import io
data1 = '''
x1 x2 value1 value2
A C 1 2
B D 3 4
C E 5 6
'''
data2 = '''
x1 x2 value1 value2
A E 1.0 2.0
B D 3.0 4.0
C F 5.0 6.0
B NaN 3.0 NaN
NaN T NaN NaN
'''
df1 = pd.read_csv(io.StringIO(data1), sep=r'\s+')
df2 = pd.read_csv(io.StringIO(data2), sep=r'\s+')
df1
# ...
df2
# ...
这两个 DataFrame 的相同,期望以 x1 和 x2 为基础,将 value1 和 value2 两个列的对应数据相加,最终的数据是以先 df1 后 df2 为顺序的。
'''
x1 x2 value1 value2
0 A C 1.0 2.0
1 B D 6.0 8.0
2 C E 5.0 6.0
3 A E 1.0 2.0
4 B D 6.0 8.0
5 C F 5.0 6.0
6 B NaN 3.0 NaN
7 NaN T NaN NaN
'''
这是一个典型的向量化将两个数据相加的问题,pandas 向量化计算时会以行列标签进行对齐,然后将对应位置的值进行计算。
先将这两个数据的 x1 和 x2 设置为索引,进行向量化操作。具体到此需求时,会涉及到无法对齐的问题,我们可以用 add()
方法中的 fill_value 参数进行指定无法对齐的值。
然后再用 reindex()
重新设置索引的顺序,传入的多层索引需要将两个 DataFrame 的索引拼接起来。
最后,再重置索引,得到最终想要的数据。
先将两个 DataFrame 重新设置索引:
_, d1, d2 = (cols:=['x1', 'x2'],
df1.set_index(cols),
df2.set_index(cols)
)
然后向量化相加、重新指定索引、重置索引:
(
d1.add(d2, fill_value=0)
.reindex(d1.index.append(d2.index))
.reset_index()
)
'''
x1 x2 value1 value2
0 A C 1.0 2.0
1 B D 6.0 8.0
2 C E 5.0 6.0
3 A E 1.0 2.0
4 B D 6.0 8.0
5 C F 5.0 6.0
6 B NaN 3.0 NaN
7 NaN T NaN NaN
'''
这样就完成了最终的需求。
(完)
更新时间:Aug. 18, 2024, 4:22 p.m. 标签:pandas python 合并