【pandas】 之 Series、DataFrame 的拼接 —— pd.concat、df.append(df)

____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 增加行列),并可指定合并的轴。

官网 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)

参数 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

  • 10
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值