前言
HP大法最近新出了一个HP Support Assistant的更新啊,excited啊
【后期校对的作者表示那就是个垃圾woc叫我创建恢复盘结果写了半个小时到99%的时候md退出了?睿智啊】
今天可定可定就是pandas系列的完结了,万岁!【自己挖的坑死也要填完~】
【阿no......那个.....excuse me......】
【说!】
【那个,那个Matplotlib绘图的教程】
【.......,无路赛!巴嘎!】
正文
关键轴合并merge
有时候会出现两个有一些【一些】相同数据的DataFrame,如果我们用concat没有办法合并重复的部分,使用join又把所有的重叠部分都给合并了.....
这个时候我们就可以尝试一下merge,在merge里面指定几个关键词,如果所有的DataFrame都有带有这几个关键词的列,就合并这几个关键词的列,其他的不是这几个关键词的,就算重叠了也不合并来着。
>>> import numpy as np
>>> import pandas as pd
>>> left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
... 'A': ['A0', 'A1', 'A2', 'A3'],
... 'B': ['B0', 'B1', 'B2', 'B3']})
>>> right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
... 'C': ['C0', 'C1', 'C2', 'C3'],
... 'D': ['D0', 'D1', 'D2', 'D3']})
>>> left
A B key
0 A0 B0 K0
1 A1 B1 K1
2 A2 B2 K2
3 A3 B3 K3
>>> right
C D key
0 C0 D0 K0
1 C1 D1 K1
2 C2 D2 K2
3 C3 D3 K3
>>> res = pd.merge(left,right,on='key') #这里的key是两边都有的列
>>> print(res)
A B key C D
0 A0 B0 K0 C0 D0
1 A1 B1 K1 C1 D1
2 A2 B2 K2 C2 D2
3 A3 B3 K3 C3 D3
>>> res = pd.merge(left,right,on='C')#‘C’标签不是重复的,所以会报错
Traceback (most recent call last):
..........
KeyError: 'C'
如果是多个相同标签的话,就可以指定哪个标签要合并的x:
>>> left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
... 'key2': ['K0', 'K1', 'K0', 'K1'],
... 'A': ['A0', 'A1', 'A2', 'A3'],
... 'B': ['B0', 'B1', 'B2', 'B3']})
>>> right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
... 'key2': ['K0', 'K0', 'K0', 'K0'],
... 'C': ['C0', 'C1', 'C2', 'C3'],
... 'D': ['D0', 'D1', 'D2', 'D3']})
>>> left
A B key1 key2
0 A0 B0 K0 K0
1 A1 B1 K0 K1
2 A2 B2 K1 K0
3 A3 B3 K2 K1
>>> right
C D key1 key2
0 C0 D0 K0 K0
1 C1 D1 K1 K0
2 C2 D2 K1 K0
3 C3 D3 K2 K0
>>> res = pd.merge(left,right,on=['key1','key2'])#把所有的重叠部分都进行合并
>>> res1 = pd.merge(left,right,on=['key1'])#只合并重叠的key1
>>> res
A B key1 key2 C D
0 A0 B0 K0 K0 C0 D0
1 A2 B2 K1 K0 C1 D1
2 A2 B2 K1 K0 C2 D2
>>> res1
A B key1 key2_x C D key2_y
0 A0 B0 K0 K0 C0 D0 K0
1 A1 B1 K0 K1 C0 D0 K0
2 A2 B2 K1 K0 C1 D1 K0
3 A2 B2 K1 K0 C2 D2 K0
4 A3 B3 K2 K1 C3 D3 K0
不知道同志们有没有注意到一点:pd.merge(left,right,on=['key1','key2'])只产生了3行,但是两个列表都是四行的为什么合并出来只有三行呢?
因为在这个使用了和concat一样默认的合并方法-inner,也就是说只有重叠的key1和key2行的行才会被合并的,但是我们有一行是不一样的,所以就没有合并进去。
如果我们把innner改成outer呢?
你会发现没有join='outner'这种写法,
how='outer/inner/left/right'
警告:不要把onter写成outnner【至于为什么是inner不是iner我就不知道了就你话多】
>>> res = pd.merge(left,right,on=['key1','key2'],how='outer')
#就是把key1和key2放在一个表格里面
>>> res
A B key1 key2 C D
0 A0 B0 K0 K0 C0 D0
1 A1 B1 K0 K1 NaN NaN
2 A2 B2 K1 K0 C1 D1
3 A2 B2 K1 K0 C2 D2
4 A3 B3 K2 K1 NaN NaN
5 NaN NaN K2 K0 C3 D3
>>> res = pd.merge(left,right,on=['key1','key2'],how='inner')
#把key1,key2重叠的值放在表格里面
>>> res
A B key1 key2 C D
0 A0 B0 K0 K0 C0 D0
1 A2 B2 K1 K0 C1 D1
2 A2 B2 K1 K0 C2 D2
>>> res = pd.merge(left,right,on=['key1','key2'],how='left')
#基于左边的DataFrame来合并【右边的没有的话重复就NaN】
>>> res
A B key1 key2 C D
0 A0 B0 K0 K0 C0 D0
1 A1 B1 K0 K1 NaN NaN
2 A2 B2 K1 K0 C1 D1
3 A2 B2 K1 K0 C2 D2
4 A3 B3 K2 K1 NaN NaN
>>> res = pd.merge(left,right,on=['key1','key2'],how='right')
#基于右边的DataFrame来合并【左边的没有的话重复就NaN】
>>> res
A B key1 key2 C D
0 A0 B0 K0 K0 C0 D0
1 A2 B2 K1 K0 C1 D1
2 A2 B2 K1 K0 C2 D2
3 NaN NaN K2 K0 C3 D3
这里介绍一个贴心的开关:Indicator=True
这个功能可以把每一行合并的情况【左边右边都有啊?还是只有左边有没有右边之类的】放在合并后的respons的最右边一行:
>>> res = pd.merge(left,right,on=['key1','key2'],how='outer',indicator=True)
>>> res
A B key1 key2 C D _merge
0 A0 B0 K0 K0 C0 D0 both
1 A1 B1 K0 K1 NaN NaN left_only
2 A2 B2 K1 K0 C1 D1 both
3 A2 B2 K1 K0 C2 D2 both
4 A3 B3 K2 K1 NaN NaN left_only
5 NaN NaN K2 K0 C3 D3 right_only
看上面的表格,那个_merge多吃藕啊,不行要改掉改掉【滑稽】
我们把True改成你想要的名字就行了x
>>> res = pd.merge(left,right,on=['key1','key2'],how='outer',indicator='合并情况')
>>> res
A B key1 key2 C D 合并情况
0 A0 B0 K0 K0 C0 D0 both
1 A1 B1 K0 K1 NaN NaN left_only
2 A2 B2 K1 K0 C1 D1 both
3 A2 B2 K1 K0 C2 D2 both
4 A3 B3 K2 K1 NaN NaN left_only
5 NaN NaN K2 K0 C3 D3 right_only
基于行的合并-left/right-index开关
不仅仅是使用相同的column,我们还可以使用index,但是需要把开关给打开来着。
>>> left = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
... 'B': ['B0', 'B1', 'B2']},
... index=['K0', 'K1', 'K2'])
>>> right = pd.DataFrame({'C': ['C0', 'C2', 'C3'],
... 'D': ['D0', 'D2', 'D3']},
... index=['K0', 'K2', 'K3'])
>>> left
A B
K0 A0 B0
K1 A1 B1
K2 A2 B2
>>> right
C D
K0 C0 D0
K2 C2 D2
K3 C3 D3
现在我们看到了不同的index了,现在就用left/right_index=True来合并他们。
注意:以目前作者作死尝试【建议你也试一试嘻嘻嘻】的样子来看,left和right必须都是为true的情况下才能合并的x
>>> res = pd.merge(left,right,left_index=True,right_index=True,how='outer',indicator='合并情况')
>>> res
A B C D 合并情况
K0 A0 B0 C0 D0 both
K1 A1 B1 NaN NaN left_only
K2 A2 B2 C2 D2 both
K3 NaN NaN C3 D3 right_only
>>> res = pd.merge(left,right,left_index=True,right_index=True,how='inner',indicator='合并情况')
>>> res
A B C D 合并情况
K0 A0 B0 C0 D0 both
K2 A2 B2 C2 D2 both
>>> res = pd.merge(left,right,left_index=True,how='outer',indicator='合并情况')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
.........
raise MergeError('Must pass right_on or right_index=True')
pandas.core.reshape.merge.MergeError: Must pass right_on or right_index=True
附:在这一章的知识下你都可以在指令下加上 indicator=True来辅助理解,比如前面所以的merge的inner和outer都可以加上indicatoe=True
处理overlapping问题
有点时候当我们合并一些值的时候,我们需要更改合并后的标签来方便阅读来着。
【为什么不合并完了再修改标签呢?】
【就你话多】
下面就是一个很典型的栗子:
age标签都是相同的,但是含义上又是不同的【一个为男生一个为女生】如果我们直接去合并他的话就会出现下面的问题。
>>> boys = pd.DataFrame({'k': ['K0', 'K1', 'K2'], 'age': [1, 2, 3]})
>>> girls = pd.DataFrame({'k': ['K0', 'K0', 'K3'], 'age': [4, 5, 6]})
>>> boys
age k
0 1 K0
1 2 K1
2 3 K2
>>> girls
age k
0 4 K0
1 5 K0
2 6 K3
>>> res = pd.merge(boys,girls,on = 'k' ,how='outer',indicator='合并情况')
>>> res
age_x k age_y 合并情况
0 1.0 K0 4.0 both
1 1.0 K0 5.0 both
2 2.0 K1 NaN left_only
3 3.0 K2 NaN left_only
4 NaN K3 6.0 right_only
#直接合并出现x和y【根本就不是xy染色体辣这个是默认值qwq】
现在我们更改上面的x和y,如何自定义呢?
suffixes=['name of x, 'name of y']
>>> res = pd.merge(boys, girls, on='k', suffixes=['_boy', '_girl'], how='outer',indicator='合并情况')
>>> res
age_boy k age_girl 合并情况
0 1.0 K0 4.0 both
1 1.0 K0 5.0 both
2 2.0 K1 NaN left_only
3 3.0 K2 NaN left_only
4 NaN K3 6.0 right_only
0x02 万众瞩目的绘图时间到!【预告+联动?】
![](https://img.haomeiwen.com/i10219317/7f4ba5afb5b1b0b9.png)
猜猜这是那一个res的表格【笑】
>>> # 随机生成1000个数据
... data = pd.Series(np.random.randn(1000),index=np.arange(1000))
>>>
... # 为了方便观看效果, 我们累加这个数据
... data.cumsum()
0 -0.560603
1 -0.787440
2 -0.075940
3 -0.372832
4 -0.514074
5 -0.356293
..........
998 10.523711
999 11.091323
Length: 1000, dtype: float64
>>>
>>> # pandas 数据可以直接观看其可视化形式
... data.plot()
<matplotlib.axes._subplots.AxesSubplot object at 0x000002DEAFD88240>
>>>
>>> plt.show()
![](https://img.haomeiwen.com/i10219317/8aa2614a0b76ddbe.png)
【施工中,敬请期待嘻嘻嘻】
后记
淦,终于填完了远古巨坑了
累坏了啊啊啊~【伸个懒腰】
估计下一周又要开始填坑了,祝福我二外考试rp++把
参考资料:
Pandas 合并 merge
Pandas plot 出图
最后的最后
昨晚真的真的真的更新了辣宝贝你还不来看看嘛?
网友评论