看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
pandas 数据的连接可以实现纵向和横向连接,将数据连接后会形成一个新的对象, Series 或 DataFrame。连接是最常用的多个数据合并操作。
pd.concat()
是专门用于数据连接合并的函数,它可以沿着行或者列进行操作,同时可以指定非合并轴的合并方式(合集、交集等)。可以详细参阅pd.concat API 说明。
以下有三个 df ,后续的操作我们将对他们进行合并处理。
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']},
index=[0, 1, 2, 3])
df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
'B': ['B4', 'B5', 'B6', 'B7'],
'C': ['C4', 'C5', 'C6', 'C7'],
'D': ['D4', 'D5', 'D6', 'D7']},
index=[4, 5, 6, 7])
df3 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'],
'B': ['B8', 'B9', 'B10', 'B11'],
'C': ['C8', 'C9', 'C10', 'C11'],
'D': ['D8', 'D9', 'D10', 'D11']},
index=[8, 9, 10, 11])
将三个有相同列的表合并到一起,并使用新的自然索引:
frames = [df1, df2, df3]
df = pd.concat(frames)
我们可以再给每个表给一个一级索引,形成多层索引:
df = pd.concat(frames, keys=['x', 'y', 'z'])
df.loc['y'] # 看一级索引 y
'''
A B C D
4 A4 B4 C4 D4
5 A5 B5 C5 D5
6 A6 B6 C6 D6
7 A7 B7 C7 D7
'''
在合并不保留原索引,启用新的自然索引:
result = pd.concat([df1, df4], ignore_index=True, sort=False)
按列进行连接,没有的值为空:
df4 = pd.DataFrame({'B': ['B2', 'B3', 'B6', 'B7'],
'D': ['D2', 'D3', 'D6', 'D7'],
'F': ['F2', 'F3', 'F6', 'F7']},
index=[2, 3, 6, 7])
df = pd.concat([df1, df4], axis=1, sort=False)
以上连接后得到了两个表内容的并集(默认是 join ='outer'
),如果我们需要交集呢?
df = pd.concat([df1, df4], axis=1, join='inner')
可见只将以有共同索引的内容进行了合并。
如果我们只需要第一张表索引的内容,可以:
# 以下两个方法效果一样
pd.concat([df1, df4], axis=1).reindex(df1.index)
pd.concat([df1, df4.reindex(df1.index)], axis=1)
不用维度的数据也可以合并,df 和 s 合并:
s1 = pd.Series(['X0', 'X1', 'X2', 'X3'], name='X')
df = pd.concat([df1, s1], axis=1)
但是,还是建议使用 df.assign() 来定义一个新列。
如果序列没名称,会自动给写 012 之类的自然索引名称:
s2 = pd.Series(['_0', '_1', '_2', '_3'])
df = pd.concat([df1, s2, s2, s2], axis=1)
ignore_index=True
会取消原有列名:
df = pd.concat([df1, s1], axis=1, ignore_index=True)
以下数据合并后的列名有:
s3 = pd.Series([0, 1, 2, 3], name='foo')
s4 = pd.Series([0, 1, 2, 3])
s5 = pd.Series([0, 1, 4, 5])
pd.concat([s3, s4, s5], axis=1)
'''
foo 0 1
0 0 0 0
1 1 1 1
2 2 2 4
3 3 3 5
'''
给定 keys 会采用新的列名:
pd.concat([s3, s4, s5], axis=1, keys=['red', 'blue', 'yellow'])
'''
red blue yellow
0 0 0 0
1 1 1 1
2 2 2 4
3 3 3 5
'''
如果是 df 连接行,则指定为索引名:
df = pd.concat(frames, keys=['x', 'y', 'z'])
也可以用字典形式,定义各自表的索引名称:
pieces = {'x': df1, 'y': df2, 'z': df3}
df = pd.concat(pieces)
只取字典中的部分:
df = pd.concat(pieces, keys=['z', 'y'])
多层数据的索引如下:
result.index.levels
# FrozenList([['z', 'y'], [4, 5, 6, 7, 8, 9, 10, 11]])
如果希望指定其他级别(有时会这样),则可以使用level参数来指定:
df = pd.concat(pieces, keys=['x', 'y', 'z'],
levels=[['z', 'y', 'x', 'w']],
names=['group_key'])
df.index.levels
# FrozenList([['z', 'y', 'x', 'w'], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]])
pd.concat()
是最常用的数据连接工具,需要熟练掌握。
更新时间:2024-05-14 10:07:20 标签:pandas 连接