____tz_zs
官网相关介绍:
https://pandas.pydata.org/pandas-docs/version/0.22/generated/pandas.concat.html
https://pandas.pydata.org/pandas-docs/stable/merging.html#
.
#!/usr/bin/python2.7
# -*- coding:utf-8 -*-
"""
@author: tz_zs
"""
import numpy as np
import pandas as pd
data1 = [[11, 12, 13, 14, 15], [21, 22, 23, 24, 25], [31, 32, 33, 34, 35], [41, 42, 43, 44, 45]]
date_range1 = pd.date_range(start="20180701", periods=4)
df = pd.DataFrame(data=data1, index=date_range1,
columns=['a', 'b', 'c', 'd', 'e'])
print df
"""
a b c d e
2018-07-01 11 12 13 14 15
2018-07-02 21 22 23 24 25
2018-07-03 31 32 33 34 35
2018-07-04 41 42 43 44 45
"""
data2 = [1, 2, 3, 4]
date_range2 = pd.date_range(start="20180702", periods=4)
df2 = pd.Series(data=data2, index=date_range2, name='f')
print df2
"""
2018-07-02 1
2018-07-03 2
2018-07-04 3
2018-07-05 4
Freq: D, Name: f, dtype: int64
"""
data3 = [['1e', '1g', '1h'], ['2e', '2g', '2h'], ['3e', '3g', '3h'], ['4e', '4g', '4h']]
date_range3 = pd.date_range(start="20180703", periods=4)
df3 = pd.DataFrame(data=data3, index=date_range3, columns=['e', '3g', '3h'])
print df3
"""
e 3g 3h
2018-07-03 1e 1g 1h
2018-07-04 2e 2g 2h
2018-07-05 3e 3g 3h
2018-07-06 4e 4g 4h
"""
.
方法一:将 Series 或 df 的一列直接赋给原始 df 作为一列
此种用法 pandas 会自动将插入的数据对齐到原始 df 的 index ,缺失值的地方为 NaN,index 之外的值将舍弃掉。
df["f"] = df2
print df
"""
a b c d e f
2018-07-01 11 12 13 14 15 NaN
2018-07-02 21 22 23 24 25 1.0
2018-07-03 31 32 33 34 35 2.0
2018-07-04 41 42 43 44 45 3.0
"""
df['3g'] = df3['3g']
df['3h'] = df3['3h']
print df
"""
a b c d e f 3g 3h
2018-07-01 11 12 13 14 15 NaN NaN NaN
2018-07-02 21 22 23 24 25 1.0 NaN NaN
2018-07-03 31 32 33 34 35 2.0 1g 1h
2018-07-04 41 42 43 44 45 3.0 2g 2h
"""
方法二:pd.concat
此种方法,将完整的保留数据(不会丢弃数据,而是根据 index 和 columns 增加行列),并可指定合并的轴。
pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,
keys=None, levels=None, names=None, verify_integrity=False,
copy=True)
参数 axis 默认为0
df4 = pd.concat([df, df2, df3], axis=0)
print df4
"""
0 a b c d e 3g 3h
2018-07-01 NaN 11.0 12.0 13.0 14.0 15 NaN NaN
2018-07-02 NaN 21.0 22.0 23.0 24.0 25 NaN NaN
2018-07-03 NaN 31.0 32.0 33.0 34.0 35 NaN NaN
2018-07-04 NaN 41.0 42.0 43.0 44.0 45 NaN NaN
2018-07-02 1.0 NaN NaN NaN NaN NaN NaN NaN
2018-07-03 2.0 NaN NaN NaN NaN NaN NaN NaN
2018-07-04 3.0 NaN NaN NaN NaN NaN NaN NaN
2018-07-05 4.0 NaN NaN NaN NaN NaN NaN NaN
2018-07-03 NaN NaN NaN NaN NaN 1e 1g 1h
2018-07-04 NaN NaN NaN NaN NaN 2e 2g 2h
2018-07-05 NaN NaN NaN NaN NaN 3e 3g 3h
2018-07-06 NaN NaN NaN NaN NaN 4e 4g 4h
"""
df4 = pd.concat([df, df2, df3], axis=1)
print df4
"""
a b c d e f e 3g 3h
2018-07-01 11.0 12.0 13.0 14.0 15.0 NaN NaN NaN NaN
2018-07-02 21.0 22.0 23.0 24.0 25.0 1.0 NaN NaN NaN
2018-07-03 31.0 32.0 33.0 34.0 35.0 2.0 1e 1g 1h
2018-07-04 41.0 42.0 43.0 44.0 45.0 3.0 2e 2g 2h
2018-07-05 NaN NaN NaN NaN NaN 4.0 3e 3g 3h
2018-07-06 NaN NaN NaN NaN NaN NaN 4e 4g 4h
"""
.
参数 join 默认为 join='outer'。如果改为 inner 则得到的是表的交集
# join 默认为 join='outer'。如果改为 inner 则得到的是表的交集
df6 = pd.concat([df, df2, df3], axis=1, join='inner')
print df5
"""
a b c d e f e 3g 3h
2018-07-03 31 32 33 34 35 2 1e 1g 1h
2018-07-04 41 42 43 44 45 3 2e 2g 2h
"""
.
参数 ignore_index 默认为 False ,当设为 ignore_index=True 时,新 df 将不会使用拼接成员 df 的 index,而是重新生成一个从 0 开始的 index 值。
df5 = pd.concat([df, df2, df3], axis=1,ignore_index=True)
print df5
"""
0 1 2 3 4 5 6 7 8
2018-07-01 11.0 12.0 13.0 14.0 15.0 NaN NaN NaN NaN
2018-07-02 21.0 22.0 23.0 24.0 25.0 1.0 NaN NaN NaN
2018-07-03 31.0 32.0 33.0 34.0 35.0 2.0 1e 1g 1h
2018-07-04 41.0 42.0 43.0 44.0 45.0 3.0 2e 2g 2h
2018-07-05 NaN NaN NaN NaN NaN 4.0 3e 3g 3h
2018-07-06 NaN NaN NaN NaN NaN NaN 4e 4g 4h
"""
df5 = pd.concat([df, df2, df3], axis=0,ignore_index=True)
print df5
"""
0 a b c d e 3g 3h
0 NaN 11.0 12.0 13.0 14.0 15 NaN NaN
1 NaN 21.0 22.0 23.0 24.0 25 NaN NaN
2 NaN 31.0 32.0 33.0 34.0 35 NaN NaN
3 NaN 41.0 42.0 43.0 44.0 45 NaN NaN
4 1.0 NaN NaN NaN NaN NaN NaN NaN
5 2.0 NaN NaN NaN NaN NaN NaN NaN
6 3.0 NaN NaN NaN NaN NaN NaN NaN
7 4.0 NaN NaN NaN NaN NaN NaN NaN
8 NaN NaN NaN NaN NaN 1e 1g 1h
9 NaN NaN NaN NaN NaN 2e 2g 2h
10 NaN NaN NaN NaN NaN 3e 3g 3h
11 NaN NaN NaN NaN NaN 4e 4g 4h
"""
.
参数 join_axes 可指定 index 来对齐数据。这样会切掉指定的 index 之外的数据。
df5 = pd.concat([df, df2, df3], axis=1, join_axes=[df.index])
print df5
"""
a b c d e f e 3g 3h
2018-07-01 11 12 13 14 15 NaN NaN NaN NaN
2018-07-02 21 22 23 24 25 1.0 NaN NaN NaN
2018-07-03 31 32 33 34 35 2.0 1e 1g 1h
2018-07-04 41 42 43 44 45 3.0 2e 2g 2h
"""
df5 = pd.concat([df, df2, df3], axis=1, join_axes=[df2.index])
print df5
"""
a b c d e f e 3g 3h
2018-07-02 21.0 22.0 23.0 24.0 25.0 1 NaN NaN NaN
2018-07-03 31.0 32.0 33.0 34.0 35.0 2 1e 1g 1h
2018-07-04 41.0 42.0 43.0 44.0 45.0 3 2e 2g 2h
2018-07-05 NaN NaN NaN NaN NaN 4 3e 3g 3h
"""
df5 = pd.concat([df, df2, df3], axis=1, join_axes=[df3.index])
print df5
"""
a b c d e f e 3g 3h
2018-07-03 31.0 32.0 33.0 34.0 35.0 2.0 1e 1g 1h
2018-07-04 41.0 42.0 43.0 44.0 45.0 3.0 2e 2g 2h
2018-07-05 NaN NaN NaN NaN NaN 4.0 3e 3g 3h
2018-07-06 NaN NaN NaN NaN NaN NaN 4e 4g 4h
"""
df5 = pd.concat([df, df2, df3], axis=1, join_axes=[pd.date_range(start="20180704", periods=4)])
print df5
"""
a b c d e f e 3g 3h
2018-07-04 41.0 42.0 43.0 44.0 45.0 3.0 2e 2g 2h
2018-07-05 NaN NaN NaN NaN NaN 4.0 3e 3g 3h
2018-07-06 NaN NaN NaN NaN NaN NaN 4e 4g 4h
2018-07-07 NaN NaN NaN NaN NaN NaN NaN NaN NaN
"""
.
方法三:df1.append(df2)
将被 append 的对象添加到调用者的末尾(类似 list 的方法)。
注意:如果调用者是 DataFrame 而被 append 的对象是 Series,将会把 Series 作为一行添加到末尾。
Series 和 DataFrame 均有此方法。
df_append_df3 = df.append(df3)
print df_append_df3
"""
3g 3h a b c d e
2018-07-01 NaN NaN 11.0 12.0 13.0 14.0 15
2018-07-02 NaN NaN 21.0 22.0 23.0 24.0 25
2018-07-03 NaN NaN 31.0 32.0 33.0 34.0 35
2018-07-04 NaN NaN 41.0 42.0 43.0 44.0 45
2018-07-03 1g 1h NaN NaN NaN NaN 1e
2018-07-04 2g 2h NaN NaN NaN NaN 2e
2018-07-05 3g 3h NaN NaN NaN NaN 3e
2018-07-06 4g 4h NaN NaN NaN NaN 4e
"""
df2_append_df3 = df2.append(df3)
print df2_append_df3
"""
0 3g 3h e
2018-07-02 1.0 NaN NaN NaN
2018-07-03 2.0 NaN NaN NaN
2018-07-04 3.0 NaN NaN NaN
2018-07-05 4.0 NaN NaN NaN
2018-07-03 NaN 1g 1h 1e
2018-07-04 NaN 2g 2h 2e
2018-07-05 NaN 3g 3h 3e
2018-07-06 NaN 4g 4h 4e
"""
.
end