请 [注册] 或 [登录]  | 返回主站

量化交易吧 /  数理科学 帖子:3354535 新帖:32

DataFrame之数据拼接

外汇交易达人发表于:6 月 7 日 02:10回复(1)

对于DataFrame的拼接方法

【DataFrame】+ , concat , join,append,update¶

在数据外理时, Dataframe是使用频率非常高的,很多时候我们需要将多个Dataframe进行合并,这时候需要用到Join Append Concat函数,在这里实例简单比较一下区别。

初级应用,暂时没有去设置更复杂的参数,如join key name ignore_index 等

  • ‘+ 合并所有的index columns, 但是数据清空
  • concat 合并,功能最强大
  • join 简单地横向连接
  • append 简单地纵向连接
  • update 更新数据
import pandas as pd

合并所有的 index & columns, 但数据清空了

df1 = pd.DataFrame(index=['a','b'], columns=['1a'], data=[0,1])
df2 = pd.DataFrame(columns=['2b','2c'])
df3 = pd.DataFrame(index=['c','b'], columns=['3a'], data=[0,1])
df2 + df1 + df3
.dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }
1a 2b 2c 3a
a NaN NaN NaN NaN
b NaN NaN NaN NaN
c NaN NaN NaN NaN

concat, 万能合并¶

  • axis, 控制合并的方向 0=index(default), 1=columns
  • join_axes, 控制是否只保留某个df对应的index
  • sort, 是否对结果进行排序
  • join:连接的方式 inner交集(xor),只保留都存在的index, outer并集(or),保留所有的index
  • key: 要在相接的时候在加上一个层次的key来识别数据源自于哪张表,可以增加key参数
df1 = pd.DataFrame(index=['a','b'], columns=['1a'], data=[0,1])
df2 = pd.DataFrame(index=['a','d'], columns=['2a'], data=[0,1])
print(df1, '\n')
df2
   1a
a   0
b   1 

.dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }
2a
a 0
d 1
pd.concat([df1, df2], sort=False)    # 纵向拼接(似append),
.dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }
1a 2a
a 0.0 NaN
b 1.0 NaN
a NaN 0.0
d NaN 1.0
pd.concat([df2, df1], axis=1, sort=True)  # 横向表拼接(似join),index重名会被忽略
.dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }
2a 1a
a 0.0 0.0
b NaN 1.0
d 1.0 NaN
pd.concat([df1, df2], axis=1, join_axes=[df1.index]) # 横向表拼接(似join),设置join_axes只留下df1, 和join一样了
.dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }
1a 2a
a 0 0.0
b 1 NaN

Join¶

  • 横向增加数据(有点类似concat(axis=0)), columns不允许出现同名
  • a.join(b)
  • a没这条index数据, b有, 那么数据不会被加入
  • a如果有这条index数据, b中没有,那么以NaN填充
df1 = pd.DataFrame(index=['a','b'], columns=['1a'], data=[0,1])
df3 = pd.DataFrame(index=['c'], columns=['3a','3e'], data=[[1,2]])
print(df1,'\n')
df3
   1a
a   0
b   1 

.dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }
3a 3e
c 1 2
df1.join(df3)
.dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }
1a 3a 3e
a 0 NaN NaN
b 1 NaN NaN
df3.join(df1)
.dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }
3a 3e 1a
c 1 2 NaN

append¶

  • 纵向增加数据
  • index允许有重名,不会覆盖 (如a)
  • 按columns的名称进行连续 (如1a)
  • 空白会以NaN填充 (也就是如果对方df不存在的columns会以NaN填充)
df1 = pd.DataFrame(index=['a','b'], columns=['1a'], data=[0,1])
df3 = pd.DataFrame(index=['a','c'], columns=['1a','3a','3e'], data=[[4,3,2],[4,3,2]])
print(df1, '\n')
df3
   1a
a   0
b   1 

.dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }
1a 3a 3e
a 4 3 2
c 4 3 2
df3.append(df1, sort=True)
.dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }
1a 3a 3e
a 4 3.0 2.0
c 4 3.0 2.0
a 0 NaN NaN
b 1 NaN NaN
df1.append(df3, sort=True)
.dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }
1a 3a 3e
a 0 NaN NaN
b 1 NaN NaN
a 4 3.0 2.0
c 4 3.0 2.0

update¶

  • 将df4的数据更新到df1, 如果df1没有这个key, 数据将忽略
df1 = pd.DataFrame(index=['a','b'], columns=['1a'], data=[0,1])
df4 = pd.DataFrame(index=['a'], columns=['1a'], data=[9])
print(df1)
df4
   1a
a   0
b   1
.dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }
1a
a 9
df1.update(df4)
df1
.dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }
1a
a 9.0
b 1.0

全部回复

0/140

量化课程

    移动端课程