《Merge, join, and concatenate》笔记
PS默认情况下,所有合并函数生成文件的方式均是新生成,即不修改原DF/Series数据。
常用 merge()
来添加新字段(即列), concat()
来添加新记录(即行)
++++++++++ merge() ++++++++++
pandas.merge
是pandas的全功能、 高性能的的内存连接操作,在习惯上非常类似于 SQL之类的关系数据库。- 相较于其他开源软件(如R中的
base::merge.data.frame
),pandas.merge
的性能要好得多(在某些情况下好得多一个数量级)。其原因是在DataFrame中优化的算法设计和数据的内部布局。
DataFrame.merge(
right,
how='inner',
on=None, left_on=None, right_on=None,
left_index=False, right_index=False,
sort=False,
suffixes=('_x', '_y'),
copy=True,
indicator=False,
Validate=None
)
- merge两个DataFrame:
>>> A >>> B
lkey value rkey value
0 foo 1 0 foo 5
1 bar 2 1 bar 6
2 baz 3 2 qux 7
3 foo 4 3 bar 8
>>> A.merge(B, left_on='lkey', right_on='rkey', how='outer')
lkey value_x rkey value_y
0 foo 1 foo 5
1 foo 4 foo 5
2 bar 2 bar 6
3 bar 2 bar 8
4 baz 3 NaN NaN
5 NaN NaN qux 7
- merge多个DataFrame与之类似,直接向后添加:
A.merge(B, right_on='col_r', left_on='col_l', how='outer').merge(C, right_on='col_r1', left_on='col_l1', how='outer')
注:
- 截止到2019上半年,
merge()
函数仍然会合并左右表的NaN 和 None,详见GH22491 和GH22618。 - 假如要删除NaN 和 None,使用
new_df.dropna(subset=['key_or_keys], inplace=True)
。
"""NaN是float,None是object,虽然都可以在numpy中运行、但是None会把numpy计算性能拉到底,NaN不会。"""
s_bad = pd.Series([1, None], dtype=object)
s_good = pd.Series([1, np.nan])
print (s_bad )
print (s_good )
0 1
1 None
dtype : object
0 1.0
1 NaN
dtype : float64
print (s_bad .dropna ())
print (s_good .dropna ())
0 1
dtype : object
0 1.0
dtype : float64
print (s_bad .isnull ())
print (s_good .isnull ())
0 False
1 True
dtype : bool
0 False
1 True
dtype : bool
++++++++++ concat() ++++++++++
- 默认按照axis=0执行合并,即默认向df1添加行。
- 如果df2有df1没有的列,也添加列。
concat()函数一边按照an axis执行所有的复杂合并命令,同时(如果有的话)按其他axes执行运算,还执行参数”join”的设定 innor | outer命令。注意,之所以说”如果有”,是因为Series只有一个axis。
pandas.concat(
objs,
axis=0,
join='outer',
sort=None,
gnore_index=False,
verify_integrity=False,
join_axes=None, keys=None, levels=None, names=None,copy=True)
- 多个DataFrame的话,多注意 “按axes(即第一个axis之外的axis/axes)的合并”,还有”设置更多条件的合并”(
axis
、join
。 进一步有sort
操作,且未来的join
不再默认执行sort=True
,需要主动设置)、 join = innor/outer
操作的是axis( 它其实是实际意义上的index,如果你对该函数较熟悉的话)。- 搭配
keys
合并后的表,可以快速的提取数据,key的对象随axis的取值变化而改变。 ignore_index
搭配axis
:实现用递增的数字,作为新DF的字段名称;- 把参数
index
换成参数join_axes
可以实现相当于SQL的left join功能,即只保左边表df1的index。例如result = pd.concat([df1, df4], axis=1, join_axes=[df1.index])
。
++++++++++ append() ++++++++++
功能:简化版的 concat()
(实际上比concat诞生的早)。同样是用来处理Dataframe/Series。
DataFrame.append(
other,
sort=None,
ignore_index=False,
verify_integrity=False)
附注:一个Series合并到一个DataFrame
如果我们要把一个Series合并到一个DataFrame的话,用 DataFrame.assign()
可以得到相同的结果。
但是对于任意数量的DataFrame/Series对象,请使用 concat()
。
concat()
和append()
通用的:
– 比如2个表的index一个是[i, ii, iii, iv],一个是[a, b, c, d],通过设定ignore_index=True
,即用新的index[0, 1, 2, 3]来添加合并对象。
-仅适用于concat()
的:
–ignore_index=True
搭配axis=1
(行名称变成了事实上的Column,列名称反而成了事实上的index),可以在合并结果中用 数字序号作为 列名称;- 仅适用于
append()
的:
– 直接把一个手写Series 的列 或者一个dict 的列集,合并到DataFrame 行的后边得到一个新的DF。虽然不是特别有效率(因为函数应用的对象Series/DF需要手工码出来)。
— e.g. 手写Series类型数据,手写dict类型数据。其结果不容易理解,一般使用merge
或者concat
:
import pandas as pd
df1 = pd .DataFrame ([5 , 6 , 7 , 8 ], index =[‘A’, ‘B’, ‘C’, ‘Y’])
print (df1 )
s2 = pd .Series ([‘X0’, ‘X1’, ‘X2’, ‘X3’])
print (s2 )
dicts = [{‘A’: 1 , ‘B’: 2 , ‘C’: 3 , ‘X’: 4 },
{‘A’: 5 , ‘B’: 6 , ‘C’: 7 , ‘Y’: 8 }]
print (dicts )
0
A 5
B 6
C 7
Y 8
0 X0
1 X1
2 X2
3 X3
dtype : object
[{‘A’: 1 , ‘B’: 2 , ‘C’: 3 , ‘X’: 4 }, {‘A’: 5 , ‘B’: 6 , ‘C’: 7 , ‘Y’: 8 }]
result = df1.append(s2, ignore_index=True)
print(result)
b = df1.append(dicts, ignore_index=True)
print(b)
0 1 2 3
0 5 NaN NaN NaN
1 6 NaN NaN NaN
2 7 NaN NaN NaN
3 8 NaN NaN NaN
4 X0 X1 X2 X3
0 A B C X Y
0 5.0 NaN NaN NaN NaN NaN
1 6.0 NaN NaN NaN NaN NaN
2 7.0 NaN NaN NaN NaN NaN
3 8.0 NaN NaN NaN NaN NaN
4 NaN 1.0 2.0 3.0 4.0 NaN
5 NaN 5.0 6.0 7.0 NaN 8.0
++++++++++ JOIN() ++++++++++
它通过索引或者指定的列把来自其他DaraFrame的列添加到左DF上。
如果只按照索引进行join的话,可以迅速的同时jion多个DataFrame。
DataFrame.join(
other,
on=None,
how='left',
lsuffix='',
rsuffix='',
sort=False
)
例子:
new_df = left.join(right, on=key_or_keys)
- 等价于
new_df = pd.merge(left, right, left_on=key_or_keys, right_index=True, how='left', sort=False)
- 还等价于
new_df = left.merge(right, on=key_or_keys, how='left')
DataFrame提供了 pandas.DataFrame.merge()
和 pandas.DataFrame.join()
作为使用 pandas.merge()
的快捷方式。
例如 df1.merge(right=df2, ...)
,也即 pandas.merge(left=df1, right=df2, ...)
。
两者都能按照行名称匹配出新的一列。
- map()在知道所有映射关系后,能方便快捷的匹配映射数据。
- 貌似有很多路径可以实现类似EXCEL的VLOOKUP功能。
Original: https://blog.csdn.net/sinat_23971513/article/details/115392664
Author: sljwy
Title: pandas -表的横向合并 纵向合并
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/679277/
转载文章受原作者版权保护。转载请注明原作者出处!