美文网首页
2018-04-29-大结局!Pandas(四)

2018-04-29-大结局!Pandas(四)

作者: 0xC00005 | 来源:发表于2018-04-30 11:28 被阅读0次

前言

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 万众瞩目的绘图时间到!【预告+联动?】

Figure_1.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()
Figure_1-1.png

【施工中,敬请期待嘻嘻嘻】

后记

淦,终于填完了远古巨坑了
累坏了啊啊啊~【伸个懒腰】

估计下一周又要开始填坑了,祝福我二外考试rp++把

参考资料:
Pandas 合并 merge
Pandas plot 出图

最后的最后
昨晚真的真的真的更新了辣宝贝你还不来看看嘛?

相关文章

网友评论

      本文标题:2018-04-29-大结局!Pandas(四)

      本文链接:https://www.haomeiwen.com/subject/riczlftx.html