pandas dataframe的合并(append, merge, concat)
>>> df1 = pd.DataFrame(np.ones((4, 4))*1, columns=list('DCBA'), index=list('4321'))
>>> df2 = pd.DataFrame(np.ones((4, 4))*2, columns=list('FEDC'), index=list('6543'))
>>> df3 = pd.DataFrame(np.ones((4, 4))*3, columns=list('FEBA'), index=list('6521'))
>>> df1
D C B A
4 1.0 1.0 1.0 1.0
3 1.0 1.0 1.0 1.0
2 1.0 1.0 1.0 1.0
1 1.0 1.0 1.0 1.0
>>> df2
F E D C
6 2.0 2.0 2.0 2.0
5 2.0 2.0 2.0 2.0
4 2.0 2.0 2.0 2.0
3 2.0 2.0 2.0 2.0
>>> df3
F E B A
6 3.0 3.0 3.0 3.0
5 3.0 3.0 3.0 3.0
2 3.0 3.0 3.0 3.0
1 3.0 3.0 3.0 3.0
1,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)
示例:
>>> pd.concat([df1, df2])
A B C D E F
4 1.0 1.0 1.0 1.0 NaN NaN
3 1.0 1.0 1.0 1.0 NaN NaN
2 1.0 1.0 1.0 1.0 NaN NaN
1 1.0 1.0 1.0 1.0 NaN NaN
6 NaN NaN 2.0 2.0 2.0 2.0
5 NaN NaN 2.0 2.0 2.0 2.0
4 NaN NaN 2.0 2.0 2.0 2.0
3 NaN NaN 2.0 2.0 2.0 2.0
1.1,axis
默认值:axis=0
axis=0:竖方向(index)合并,合并方向index作列表相加,非合并方向columns取并集
axis=1:横方向(columns)合并,合并方向columns作列表相加,非合并方向index取并集
axis=0:
>>> pd.concat([df1, df2], axis=0)
A B C D E F
4 1.0 1.0 1.0 1.0 NaN NaN
3 1.0 1.0 1.0 1.0 NaN NaN
2 1.0 1.0 1.0 1.0 NaN NaN
1 1.0 1.0 1.0 1.0 NaN NaN
6 NaN NaN 2.0 2.0 2.0 2.0
5 NaN NaN 2.0 2.0 2.0 2.0
4 NaN NaN 2.0 2.0 2.0 2.0
3 NaN NaN 2.0 2.0 2.0 2.0
axis=1:
>>> pd.concat([df1, df2], axis=1)
D C B A F E D C
1 1.0 1.0 1.0 1.0 NaN NaN NaN NaN
2 1.0 1.0 1.0 1.0 NaN NaN NaN NaN
3 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0
4 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0
5 NaN NaN NaN NaN 2.0 2.0 2.0 2.0
6 NaN NaN NaN NaN 2.0 2.0 2.0 2.0
备注:原df中,取并集的行/列名称不能有重复项,即axis=0时columns不能有重复项,axis=1时index不能有重复项:
>>> df1.columns = list('DDBA')
>>> pd.concat([df1, df2], axis=0)
ValueError: Plan shapes are not aligned
1.2,join
默认值:join=‘outer’
非合并方向的行/列名称:取交集(inner),取并集(outer)。
axis=0时join='inner',columns取交集:
>>> pd.concat([df1, df2], axis=0, join='inner')
D C
4 1.0 1.0
3 1.0 1.0
2 1.0 1.0
1 1.0 1.0
6 2.0 2.0
5 2.0 2.0
4 2.0 2.0
3 2.0 2.0
axis=1时join='inner',index取交集:
>>> pd.concat([df1, df2], axis=1, join='inner')
D C B A F E D C
4 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0
3 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0
1.3,join_axes
默认值:join_axes=None,取并集
合并后,可以设置非合并方向的行/列名称,使用某个df的行/列名称
axis=0时join_axes=[df1.columns],合并后columns使用df1的:
>>> pd.concat([df1, df2], axis=0, join_axes=[df1.columns])
D C B A
4 1.0 1.0 1.0 1.0
3 1.0 1.0 1.0 1.0
2 1.0 1.0 1.0 1.0
1 1.0 1.0 1.0 1.0
6 2.0 2.0 NaN NaN
5 2.0 2.0 NaN NaN
4 2.0 2.0 NaN NaN
3 2.0 2.0 NaN NaN
axis=1时axes=[df1.index],合并后index使用df2的:
pd.concat([df1, df2], axis=1, join_axes=[df1.index])
D C B A F E D C
4 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0
3 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0
2 1.0 1.0 1.0 1.0 NaN NaN NaN NaN
1 1.0 1.0 1.0 1.0 NaN NaN NaN NaN
同时设置join和join_axes的,以join_axes为准:
>>> pd.concat([df1, df2], axis=0, join='inner', join_axes=[df1.columns])
D C B A
4 1.0 1.0 1.0 1.0
3 1.0 1.0 1.0 1.0
2 1.0 1.0 1.0 1.0
1 1.0 1.0 1.0 1.0
6 2.0 2.0 NaN NaN
5 2.0 2.0 NaN NaN
4 2.0 2.0 NaN NaN
3 2.0 2.0 NaN NaN
1.4,ignore_index
默认值:ignore_index=False
合并方向是否忽略原行/列名称,而采用系统默认的索引,即从0开始的int。
axis=0时ignore_index=True,index采用系统默认索引:
>>> pd.concat([df1, df2], axis=0, ignore_index=True)
A B C D E F
0 1.0 1.0 1.0 1.0 NaN NaN
1 1.0 1.0 1.0 1.0 NaN NaN
2 1.0 1.0 1.0 1.0 NaN NaN
3 1.0 1.0 1.0 1.0 NaN NaN
4 NaN NaN 2.0 2.0 2.0 2.0
5 NaN NaN 2.0 2.0 2.0 2.0
6 NaN NaN 2.0 2.0 2.0 2.0
7 NaN NaN 2.0 2.0 2.0 2.0
axis=1时ignore_index=True,columns采用系统默认索引:
>>> pd.concat([df1, df2], axis=1, ignore_index=True)
0 1 2 3 4 5 6 7
1 1.0 1.0 1.0 1.0 NaN NaN NaN NaN
2 1.0 1.0 1.0 1.0 NaN NaN NaN NaN
3 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0
4 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0
5 NaN NaN NaN NaN 2.0 2.0 2.0 2.0
6 NaN NaN NaN NaN 2.0 2.0 2.0 2.0
1.5,keys
默认值:keys=None
可以加一层标签,标识行/列名称属于原来哪个df。
axis=0时设置keys:
>>> pd.concat([df1, df2], axis=0, keys=['x', 'y'])
A B C D E F
x 4 1.0 1.0 1.0 1.0 NaN NaN
3 1.0 1.0 1.0 1.0 NaN NaN
2 1.0 1.0 1.0 1.0 NaN NaN
1 1.0 1.0 1.0 1.0 NaN NaN
y 6 NaN NaN 2.0 2.0 2.0 2.0
5 NaN NaN 2.0 2.0 2.0 2.0
4 NaN NaN 2.0 2.0 2.0 2.0
3 NaN NaN 2.0 2.0 2.0 2.0
axis=1时设置keys:
>>> pd.concat([df1, df2], axis=1, keys=['x', 'y'])
x y
D C B A F E D C
1 1.0 1.0 1.0 1.0 NaN NaN NaN NaN
2 1.0 1.0 1.0 1.0 NaN NaN NaN NaN
3 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0
4 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0
5 NaN NaN NaN NaN 2.0 2.0 2.0 2.0
6 NaN NaN NaN NaN 2.0 2.0 2.0 2.0
也可以传字典取代keys:
>>> pd.concat({'x': df1, 'y': df2}, axis=0)
A B C D E F
x 4 1.0 1.0 1.0 1.0 NaN NaN
3 1.0 1.0 1.0 1.0 NaN NaN
2 1.0 1.0 1.0 1.0 NaN NaN
1 1.0 1.0 1.0 1.0 NaN NaN
y 6 NaN NaN 2.0 2.0 2.0 2.0
5 NaN NaN 2.0 2.0 2.0 2.0
4 NaN NaN 2.0 2.0 2.0 2.0
3 NaN NaN 2.0 2.0 2.0 2.0
1.6,levels
默认值:levels=None
明确行/列名称取值范围:
>>> pd.concat([df1, df2], axis=0, keys=['x', 'y'], levels=[['x', 'y', 'z', 'w']])
>>> df.index.levels
[['x', 'y', 'z', 'w'], ['1', '2', '3', '4', '5', '6']]
1.7,sort
默认值:sort=True,提示新版本会设置默认为False,并取消该参数
但0.22.0中虽然取消了,还是设置为True
非合并方向的行/列名称是否排序。例如1.1中默认axis=0时columns进行了排序,axis=1时index进行了排序。
axis=0时sort=False,columns不作排序:
>>> pd.concat([df1, df2], axis=0, sort=False)
D C B A F E
4 1.0 1.0 1.0 1.0 NaN NaN
3 1.0 1.0 1.0 1.0 NaN NaN
2 1.0 1.0 1.0 1.0 NaN NaN
1 1.0 1.0 1.0 1.0 NaN NaN
6 2.0 2.0 NaN NaN 2.0 2.0
5 2.0 2.0 NaN NaN 2.0 2.0
4 2.0 2.0 NaN NaN 2.0 2.0
3 2.0 2.0 NaN NaN 2.0 2.0
axis=1时sort=False,index不作排序:
>>> pd.concat([df1, df2], axis=1, sort=False)
D C B A F E D C
4 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0
3 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0
2 1.0 1.0 1.0 1.0 NaN NaN NaN NaN
1 1.0 1.0 1.0 1.0 NaN NaN NaN NaN
6 NaN NaN NaN NaN 2.0 2.0 2.0 2.0
5 NaN NaN NaN NaN 2.0 2.0 2.0 2.0
1.8,concat多个DataFrame
>>> pd.concat([df1, df2, df3], sort=False, join_axes=[df1.columns])
D C B A
4 1.0 1.0 1.0 1.0
3 1.0 1.0 1.0 1.0
2 1.0 1.0 1.0 1.0
1 1.0 1.0 1.0 1.0
6 2.0 2.0 NaN NaN
5 2.0 2.0 NaN NaN
4 2.0 2.0 NaN NaN
3 2.0 2.0 NaN NaN
6 NaN NaN 3.0 3.0
5 NaN NaN 3.0 3.0
2 NaN NaN 3.0 3.0
1 NaN NaN 3.0 3.0
2,append
append(self, other, ignore_index=False, verify_integrity=False)
竖方向合并df,没有axis属性
不会就地修改,而是会创建副本
示例:
>>> df1.append(df2) # 相当于pd.concat([df1, df2])
A B C D E F
4 1.0 1.0 1.0 1.0 NaN NaN
3 1.0 1.0 1.0 1.0 NaN NaN
2 1.0 1.0 1.0 1.0 NaN NaN
1 1.0 1.0 1.0 1.0 NaN NaN
6 NaN NaN 2.0 2.0 2.0 2.0
5 NaN NaN 2.0 2.0 2.0 2.0
4 NaN NaN 2.0 2.0 2.0 2.0
3 NaN NaN 2.0 2.0 2.0 2.0
2.1,ignore_index属性
>>> df1.append(df2, ignore_index=True)
A B C D E F
0 1.0 1.0 1.0 1.0 NaN NaN
1 1.0 1.0 1.0 1.0 NaN NaN
2 1.0 1.0 1.0 1.0 NaN NaN
3 1.0 1.0 1.0 1.0 NaN NaN
4 NaN NaN 2.0 2.0 2.0 2.0
5 NaN NaN 2.0 2.0 2.0 2.0
6 NaN NaN 2.0 2.0 2.0 2.0
7 NaN NaN 2.0 2.0 2.0 2.0
2.2,append多个DataFrame
和concat相同,append也支持append多个DataFrame
>>> df1.append([df2, df3], ignore_index=True)
A B C D E F
0 1.0 1.0 1.0 1.0 NaN NaN
1 1.0 1.0 1.0 1.0 NaN NaN
2 1.0 1.0 1.0 1.0 NaN NaN
3 1.0 1.0 1.0 1.0 NaN NaN
4 NaN NaN 2.0 2.0 2.0 2.0
5 NaN NaN 2.0 2.0 2.0 2.0
6 NaN NaN 2.0 2.0 2.0 2.0
7 NaN NaN 2.0 2.0 2.0 2.0
8 3.0 3.0 NaN NaN 3.0 3.0
9 3.0 3.0 NaN NaN 3.0 3.0
10 3.0 3.0 NaN NaN 3.0 3.0
11 3.0 3.0 NaN NaN 3.0 3.0
3,merge
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True,
suffixes=('_x', '_y'), copy=True, indicator=False,
validate=None)
示例:
>>> left = pd.DataFrame({'A': ['a0', 'a1', 'a2', 'a3'],
'B': ['b0', 'b1', 'b2', 'b3'],
'k1': ['x', 'x', 'y', 'y']})
>>> right = pd.DataFrame({'C': ['c1', 'c2', 'c3', 'c4'],
'D': ['d1', 'd2', 'd3', 'd4'],
'k1': ['y', 'y', 'z', 'z']})
>>> left
A B k1
0 a0 b0 x
1 a1 b1 x
2 a2 b2 y
3 a3 b3 y
>>> right
C D k1
0 c1 d1 y
1 c2 d2 y
2 c3 d3 z
3 c4 d4 z
对df1和df2进行merge:
>>> pd.merge(left, right)
A B k1 C D
0 a2 b2 y c1 d1
1 a2 b2 y c2 d2
2 a3 b3 y c1 d1
3 a3 b3 y c2 d2
可以看到只有df1和df2的key1=y的行保留了下来,即默认合并后只保留有共同列项并且值相等行(即交集)。
本例中left和right的k1=y分别有2个,最终构成了2*2=4行。
如果没有共同列会报错:
>>> del left['k1']
>>> pd.merge(left, right)
pandas.errors.MergeError: No common columns to perform merge on
3.1,on属性
新增一个共同列,但没有相等的值,发现合并返回是空列表,因为默认只保留所有共同列都相等的行:
>>> left['k2'] = list('1234')
>>> right['k2'] = list('5678')
>>> pd.merge(left, right)
Empty DataFrame
Columns: [B, A, k1, k2, F, E]
Index: []
可以指定on,设定合并基准列,就可以根据k1进行合并,并且left和right共同列k2会同时变换名称后保留下来:
>>> pd.merge(left, right, on='k1')
A B k1 k2_x C D k2_y
0 a2 b2 y 3 c1 d1 5
1 a2 b2 y 3 c2 d2 6
2 a3 b3 y 4 c1 d1 5
3 a3 b3 y 4 c2 d2 6
默认值:on的默认值是所有共同列,本例为:on=['k1', 'k2']
3.2,how属性
how取值范围:'inner', 'outer', 'left', 'right'
默认值:how='inner'
‘inner’:共同列的值必须完全相等:
>>> pd.merge(left, right, on='k1', how='inner')
A B k1 k2_x C D k2_y
0 a2 b2 y 3 c1 d1 5
1 a2 b2 y 3 c2 d2 6
2 a3 b3 y 4 c1 d1 5
3 a3 b3 y 4 c2 d2 6
‘outer’:共同列的值都会保留,left或right在共同列上的差集,会对它们的缺失列项的值赋上NaN:
>>> pd.merge(left, right, on='k1', how='outer')
A B k1 k2_x C D k2_y
0 a0 b0 x 1 NaN NaN NaN
1 a1 b1 x 2 NaN NaN NaN
2 a2 b2 y 3 c1 d1 5
3 a2 b2 y 3 c2 d2 6
4 a3 b3 y 4 c1 d1 5
5 a3 b3 y 4 c2 d2 6
6 NaN NaN z NaN c3 d3 7
7 NaN NaN z NaN c4 d4 8
‘left’:根据左边的DataFrame确定共同列的保留值,右边缺失列项的值赋上NaN:
pd.merge(left, right, on='k1', how='left')
A B k1 k2_x C D k2_y
0 a0 b0 x 1 NaN NaN NaN
1 a1 b1 x 2 NaN NaN NaN
2 a2 b2 y 3 c1 d1 5
3 a2 b2 y 3 c2 d2 6
4 a3 b3 y 4 c1 d1 5
5 a3 b3 y 4 c2 d2 6
‘right’:根据右边的DataFrame确定共同列的保留值,左边缺失列项的值赋上NaN:
>>> pd.merge(left, right, on='k1', how='right')
A B k1 k2_x C D k2_y
0 a2 b2 y 3 c1 d1 5
1 a3 b3 y 4 c1 d1 5
2 a2 b2 y 3 c2 d2 6
3 a3 b3 y 4 c2 d2 6
4 NaN NaN z NaN c3 d3 7
5 NaN NaN z NaN c4 d4 8
默认值:indicator=False,不显示合并方式
设置True表示显示合并方式,即left / right / both:
>>> pd.merge(left, right, on='k1', how='outer', indicator=True)
A B k1 k2_x C D k2_y _merge
0 a0 b0 x 1 NaN NaN NaN left_only
1 a1 b1 x 2 NaN NaN NaN left_only
2 a2 b2 y 3 c1 d1 5 both
3 a2 b2 y 3 c2 d2 6 both
4 a3 b3 y 4 c1 d1 5 both
5 a3 b3 y 4 c2 d2 6 both
6 NaN NaN z NaN c3 d3 7 right_only
7 NaN NaN z NaN c4 d4 8 right_only
欢迎转载博客文章,转载请标明出处!
pandas dataframe的合并(append, merge, concat)的更多相关文章
- dataframe 合并(append, merge, concat)
https://www.cnblogs.com/guxh/p/9451532.html https://blog.csdn.net/zutsoft/article/details/51498026 写 ...
- pandas DataFrame(5)-合并DataFrame与Series
之前已经学过DataFrame与DataFrame相加,Series与Series相加,这篇介绍下DataFrame与Series的相加: import pandas as pd s = pd.Ser ...
- Pandas中DataFrame数据合并、连接(concat、merge、join)之join
pandas.DataFrame.join 自己弄了很久,一看官网.感觉自己宛如智障.不要脸了,直接抄 DataFrame.join(other, on=None, how='left', lsuff ...
- 学习笔记9—python数据表的合并(join(), merge()和concat())
merage# pandas提供了一个类似于关系数据库的连接(join)操作的方法<Strong>merage</Strong>,可以根据一个或多个键将不同DataFrame中 ...
- Pandas | Dataframe的merge操作,像数据库一样尽情join
今天是pandas数据处理第8篇文章,我们一起来聊聊dataframe的合并. 常见的数据合并操作主要有两种,第一种是我们新生成了新的特征,想要把它和旧的特征合并在一起.第二种是我们新获取了一份数据集 ...
- pandas dataframe类型操作
用python做数据分析pandas库介绍之DataFrame基本操作 怎样删除list中空字符? 最简单的方法:new_list = [ x for x in li if x != '' ] 这 ...
- pandas DataFrame 数据处理常用操作
Xgboost调参: https://wuhuhu800.github.io/2018/02/28/XGboost_param_share/ https://blog.csdn.net/hx2017/ ...
- pandas模块(很详细归类),pd.concat(后续补充)
6.12自我总结 一.pandas模块 import pandas as pd约定俗称为pd 1.模块官方文档地址 https://pandas.pydata.org/pandas-docs/stab ...
- pandas DataFrame 的横向纵向拼接组合
concat 与其说是连接,更准确的说是拼接.就是把两个表直接合在一起.于是有一个突出的问题,是横向拼接还是纵向拼接,所以concat 函数的关键参数是axis . 函数的具体参数是: concat( ...
随机推荐
- win7记事本txt图标显示异常解决方法
链接:https://zhidao.baidu.com/question/2076205353435701108.html ...
- Bootstrap3基础 disabled 多选框 鼠标放在方框与文字上都出现禁止 标识
内容 参数 OS Windows 10 x64 browser Firefox 65.0.2 framework Bootstrap 3.3.7 editor ...
- PyCharm史上最强攻略
Ctrl + D 复制选定的区域或行 Ctrl + Y 删除选定的行 Ctrl + Alt + L 代码格式化 Ctrl + Alt + O 优化导入(去掉用不到的包导入) Ctrl + 鼠标 简介/ ...
- discuz 不能上传头像提示can not write to the data/tmp folder
# discuz 不能上传头像提示can not write to the data/tmp folder 解释: disucz头像上传不成功,提示data/tmp目录没有写入权限,这里的data/t ...
- Print a file's last modified date in Bash
date -r <filename> #!/usr/bin/env bash for i in /var/log/*.out; do stat -f "%Sm" -t ...
- BZOJ5018: [Snoi2017]英雄联盟
Description 正在上大学的小皮球热爱英雄联盟这款游戏,而且打的很菜,被网友们戏称为「小学生」.现在,小皮球终于受不 了网友们的嘲讽,决定变强了,他变强的方法就是:买皮肤!小皮球只会玩N个英雄 ...
- Balloons
题目链接:http://acm.sdibt.edu.cn/JudgeOnline/problem.php?id=2401 类似求连通块的问题,可以参考紫书(P162 油田),对这两个人分别执行dfs. ...
- DIV+CSS+PS实现背景图的三层嵌套以及背景图的合并
传说中的“三层嵌套技术”. 一.背景图合并: div+css+ps合图相结合的技术:通过精确到1px的css设置,使用ps合成背景图片,特别是小图片合并,来完成页面效果. 首先讲讲三层 ...
- HTML基本内容
设置背景色:<body bgcolor="#AAAAAA">,设置背景图:<body background="1.png">. 颜色的知 ...
- [从零开始搭网站二]服务器环境配置:Mac电脑连接CentOS不用每次都输入密码
上一篇讲了如何购买服务器,并且***.看这里的第一篇文章: 从零开始搭网站 从这里开始的文章,我会默认大家都是最起码是入门级的程序员,如果你完全不懂我在说什么,那就退出好了. 作为开发人员,接下来为了 ...