pandas concat, merge, join
-
pandas concat 参数解释
pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, copy=True) 数据初始化: 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]
objs:允许[Series, DataFrame, Panel, dict]的sequence数据类型数据, 比如[{},{},{}]。
-
axis: {0, 1, …} ,0代表纵向组合,1代表横向组合, 默认为0。
>>> pd.concat(frames, axis=0) A B C D 0 A0 B0 C0 D0 1 A1 B1 C1 D1 2 A2 B2 C2 D2 3 A3 B3 C3 D3 4 A4 B4 C4 D4 5 A5 B5 C5 D5 6 A6 B6 C6 D6 7 A7 B7 C7 D7 8 A8 B8 C8 D8 9 A9 B9 C9 D9 10 A10 B10 C10 D10 11 A11 B11 C11 D11 >>> pd.concat(frames, axis=1) A B C D A B C D A B C D 0 A0 B0 C0 D0 NaN NaN NaN NaN NaN NaN NaN NaN 1 A1 B1 C1 D1 NaN NaN NaN NaN NaN NaN NaN NaN 2 A2 B2 C2 D2 NaN NaN NaN NaN NaN NaN NaN NaN 3 A3 B3 C3 D3 NaN NaN NaN NaN NaN NaN NaN NaN 4 NaN NaN NaN NaN A4 B4 C4 D4 NaN NaN NaN NaN 5 NaN NaN NaN NaN A5 B5 C5 D5 NaN NaN NaN NaN 6 NaN NaN NaN NaN A6 B6 C6 D6 NaN NaN NaN NaN 7 NaN NaN NaN NaN A7 B7 C7 D7 NaN NaN NaN NaN 8 NaN NaN NaN NaN NaN NaN NaN NaN A8 B8 C8 D8 9 NaN NaN NaN NaN NaN NaN NaN NaN A9 B9 C9 D9 10 NaN NaN NaN NaN NaN NaN NaN NaN A10 B10 C10 D10 11 NaN NaN NaN NaN NaN NaN NaN NaN A11 B11 C11 D11
-
join={'outer', 'inner'} ,如何组合数据,outer代表并集,inner代表交集。默认为outer
>>> pd.concat(frames, axis=1, join='outer') A B C D A B C D A B C D 0 A0 B0 C0 D0 NaN NaN NaN NaN NaN NaN NaN NaN 1 A1 B1 C1 D1 NaN NaN NaN NaN NaN NaN NaN NaN 2 A2 B2 C2 D2 NaN NaN NaN NaN NaN NaN NaN NaN 3 A3 B3 C3 D3 NaN NaN NaN NaN NaN NaN NaN NaN 4 NaN NaN NaN NaN A4 B4 C4 D4 NaN NaN NaN NaN 5 NaN NaN NaN NaN A5 B5 C5 D5 NaN NaN NaN NaN 6 NaN NaN NaN NaN A6 B6 C6 D6 NaN NaN NaN NaN 7 NaN NaN NaN NaN A7 B7 C7 D7 NaN NaN NaN NaN 8 NaN NaN NaN NaN NaN NaN NaN NaN A8 B8 C8 D8 9 NaN NaN NaN NaN NaN NaN NaN NaN A9 B9 C9 D9 10 NaN NaN NaN NaN NaN NaN NaN NaN A10 B10 C10 D10 11 NaN NaN NaN NaN NaN NaN NaN NaN A11 B11 C11 D11
>>> pd.concat(frames, axis=1, join='inner') Empty DataFrame Columns: [A, B, C, D, A, B, C, D, A, B, C, D] Index: []
-
ignore_index=False, 如果为true则重新设置index
>>> df4 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'], ... 'B': ['B8', 'B9', 'B10', 'B11'], ... 'C': ['C8', 'C9', 'C10', 'C11'], ... 'D': ['D8', 'D9', 'D10', 'D11']}, ... index=[1, 2, 3, 4]) >>> pd.concat([df1,df4], ignore_index=1) A B C D 0 A0 B0 C0 D0 1 A1 B1 C1 D1 2 A2 B2 C2 D2 3 A3 B3 C3 D3 4 A8 B8 C8 D8 5 A9 B9 C9 D9 6 A10 B10 C10 D10 7 A11 B11 C11 D11 >>> pd.concat([df1,df4], ignore_index=0) A B C D 0 A0 B0 C0 D0 1 A1 B1 C1 D1 2 A2 B2 C2 D2 3 A3 B3 C3 D3 1 A8 B8 C8 D8 2 A9 B9 C9 D9 3 A10 B10 C10 D10 4 A11 B11 C11 D11
-
join_axes 生成后的目标索引, 会覆盖join={'outer', 'inner'}
>>> pd.concat([df1, df4], axis=1, join_axes=[df4.index]) A B C D A B C D 1 A1 B1 C1 D1 A8 B8 C8 D8 2 A2 B2 C2 D2 A9 B9 C9 D9 3 A3 B3 C3 D3 A10 B10 C10 D10 4 NaN NaN NaN NaN A11 B11 C11 D11 >>> pd.concat([df1, df4], axis=1, join_axes=[df1.index]) A B C D A B C D 0 A0 B0 C0 D0 NaN NaN NaN NaN 1 A1 B1 C1 D1 A8 B8 C8 D8 2 A2 B2 C2 D2 A9 B9 C9 D9 3 A3 B3 C3 D3 A10 B10 C10 D10
-
keys设置多层多索引
>>> pd.concat(frames, keys=['x', 'y', 'z']) A B C D x 0 A0 B0 C0 D0 1 A1 B1 C1 D1 2 A2 B2 C2 D2 3 A3 B3 C3 D3 y 4 A4 B4 C4 D4 5 A5 B5 C5 D5 6 A6 B6 C6 D6 7 A7 B7 C7 D7 z 8 A8 B8 C8 D8 9 A9 B9 C9 D9 10 A10 B10 C10 D10 11 A11 B11 C11 D11
level设置多层目录 # todo
name 为多层目录设置名字 # todo
-
verify_integrity = False 检查是否有重复目录, 默认为false,不检查。True的话,查出会报错
>>> pd.concat(frames, axis=1,ignore_index=0, verify_integrity=False) A B C D A B C D A B C D 0 A0 B0 C0 D0 NaN NaN NaN NaN NaN NaN NaN NaN 1 A1 B1 C1 D1 NaN NaN NaN NaN NaN NaN NaN NaN 2 A2 B2 C2 D2 NaN NaN NaN NaN NaN NaN NaN NaN 3 A3 B3 C3 D3 NaN NaN NaN NaN NaN NaN NaN NaN 4 NaN NaN NaN NaN A4 B4 C4 D4 NaN NaN NaN NaN 5 NaN NaN NaN NaN A5 B5 C5 D5 NaN NaN NaN NaN 6 NaN NaN NaN NaN A6 B6 C6 D6 NaN NaN NaN NaN 7 NaN NaN NaN NaN A7 B7 C7 D7 NaN NaN NaN NaN 8 NaN NaN NaN NaN NaN NaN NaN NaN A8 B8 C8 D8 9 NaN NaN NaN NaN NaN NaN NaN NaN A9 B9 C9 D9 10 NaN NaN NaN NaN NaN NaN NaN NaN A10 B10 C10 D10 11 NaN NaN NaN NaN NaN NaN NaN NaN A11 B11 C11 D11 >>> pd.concat(frames, axis=1,ignore_index=0, verify_integrity=True) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/anaconda3/lib/python3.7/site-packages/pandas/core/reshape/concat.py", line 225, in concat copy=copy, sort=sort) File "/anaconda3/lib/python3.7/site-packages/pandas/core/reshape/concat.py", line 378, in __init__ self.new_axes = self._get_new_axes() File "/anaconda3/lib/python3.7/site-packages/pandas/core/reshape/concat.py", line 458, in _get_new_axes new_axes[self.axis] = self._get_concat_axis() File "/anaconda3/lib/python3.7/site-packages/pandas/core/reshape/concat.py", line 516, in _get_concat_axis self._maybe_check_integrity(concat_axis) File "/anaconda3/lib/python3.7/site-packages/pandas/core/reshape/concat.py", line 525, in _maybe_check_integrity '{overlap!s}'.format(overlap=overlap)) ValueError: Indexes have overlapping values: Index(['A', 'B', 'C', 'D'], dtype='object')
1, 纵向组合
使用pd.concat
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]
pd.concat(frames)
A B C D
0 A0 B0 C0 D0
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
4 A4 B4 C4 D4
5 A5 B5 C5 D5
6 A6 B6 C6 D6
7 A7 B7 C7 D7
8 A8 B8 C8 D8
9 A9 B9 C9 D9
10 A10 B10 C10 D10
11 A11 B11 C11 D11