机器学习笔记——pandas

文章目录

  • 一.Pandas基本介绍
    • 1.Series
    • 3.DataFrame的简单运用
  • 二.Pandas选择数据
    • 1.简单的筛选
    • 2.根据标签 loc
    • 3.根据序列 iloc
    • 4.根据混合的这两种 ix(老版本可用)
    • 5.通过判断的筛选
  • 三.Pandas 设置值
    • 1.根据位置设置 loc 和 iloc
    • 2.根据条件设置
    • 3.按行或列设置
    • 4.添加数据
  • 四.Pandas 处理丢失数据
    • 1.pd.dropna()
    • 2.pd.fillna()
  • 五.Pandas导入导出
  • 六.Pandas 合并 concat
    • 1.axis (合并方向)
    • 2.ignore_index (重置 index)
    • 3.join(合并方式)
    • 4.join_axes (依照 axes 合并,老版本可用)
    • 5.append(添加数据)
  • 七.Pandas 合并 merge
    • 1.依据一组key合并
    • 2.依据两组key合并
    • 3.Indicator
    • 4.依据index合并
    • 5.解决overlapping(部分重叠)的问题
  • 八.Pandas plot 出图
    • 1.Series可视化
    • 2.Dataframe 可视化

一.Pandas基本介绍

Pandas一般搭配Numpy使用

1.Series

import pandas as pd
import numpy as np
s = pd.Series([1,3,6,np.nan,12,1])
print(s)
```8

Series的字符串表现形式为:索引在左边,值在右边。由于没有为数据指定索引。于是会自动创建一个0到N-1(N为长度)的整数型索引。

import pandas as pd
import numpy as np
dates = pd.date_range('20210101',periods=6)
df = pd.DataFrame(np.random.randn(6,4),index=dates,columns=['a','b','c','d'])
print(df)
'''
                   a         b         c         d
2021-01-01 -0.823225  0.531240 -2.017726 -1.105403
2021-01-02 -1.571343  0.895134 -1.270556 -1.459767
2021-01-03  0.013902  0.363956 -1.300109 -1.214085
2021-01-04  1.007154 -1.402921 -0.150587  0.267443
2021-01-05  0.767711 -0.455705  1.092924 -2.005192
2021-01-06  0.273536 -0.073758 -0.288009  0.967713
'''

index为行索引,columns为列索引。
DataFrame是一个表格型的数据结构,它包含有一组有序的列,每列可以是不同的值类型(数值,字符串,布尔值等)。DataFrame既有行索引也有列索引, 它可以被看做由Series组成的大字典。

3.DataFrame的简单运用

根据索引挑选数据

import pandas as pd
import numpy as np
dates = pd.date_range('20220101',periods=6)
df = pd.DataFrame(np.random.randn(6,4),index=dates,columns=['a','b','c','d'])
print(df['b'])
'''
2022-01-01    0.926937
2022-01-02   -1.719632
2022-01-03    0.859291
2022-01-04    0.719781
2022-01-05   -0.186125
2022-01-06    0.814882
Freq: D, Name: b, dtype: float64
'''

创建一组没有给定行标签和列标签的数据会默认从0开始index

df1 = pd.DataFrame(np.arange(12).reshape((3,4)))
print(df1)

"""
   0  1   2   3
0  0  1   2   3
1  4  5   6   7
2  8  9  10  11
"""

若想对每一列的数据特使对待可以才有下面这种方法

import numpy as np
import pandas as pd
df2 = pd.DataFrame({'A': 1.,
                    'B': pd.Timestamp('20220101'),
                    'C': pd.Series(1, index=list(range(4)), dtype='float32'),
                    'D': np.array([3] * 4, dtype='int32'),
                    'E': pd.Categorical(["test", "train", "test", "train"]),
                    'F': 'foo'})
print(df2)
'''
     A          B    C  D      E    F
0  1.0 2022-01-01  1.0  3   test  foo
1  1.0 2022-01-01  1.0  3  train  foo
2  1.0 2022-01-01  1.0  3   test  foo
3  1.0 2022-01-01  1.0  3  train  foo
'''

如果想要查看数据中的类型, 我们可以用 dtype 这个属性

print(df2.dtypes)

"""
df2.dtypes
A           float64
B    datetime64[ns]
C           float32
D             int32
E          category
F            object
dtype: object
"""

如果想看对列的序号

print(df2.index)
# Int64Index([0, 1, 2, 3], dtype='int64')

每种数据的名称

print(df2.columns)
# Index(['A', 'B', 'C', 'D', 'E', 'F'], dtype='object')

所有df2的值

print(df2.values)
'''
[[1.0 Timestamp('2022-01-01 00:00:00') 1.0 3 'test' 'foo']
 [1.0 Timestamp('2022-01-01 00:00:00') 1.0 3 'train' 'foo']
 [1.0 Timestamp('2022-01-01 00:00:00') 1.0 3 'test' 'foo']
 [1.0 Timestamp('2022-01-01 00:00:00') 1.0 3 'train' 'foo']]
'''

describe()可用于知道数据的总结

print(df2.describle())
'''
         A    C    D
count  4.0  4.0  4.0
mean   1.0  1.0  3.0
std    0.0  0.0  0.0
min    1.0  1.0  3.0
25%    1.0  1.0  3.0
50%    1.0  1.0  3.0
75%    1.0  1.0  3.0
max    1.0  1.0  3.0
'''

transpose可用于翻转数据

print(df2.T)
'''
                     0  ...                    3
A                  1.0  ...                  1.0
B  2022-01-01 00:00:00  ...  2022-01-01 00:00:00
C                  1.0  ...                  1.0
D                    3  ...                    3
E                 test  ...                train
F                  foo  ...                  foo
'''

如果想对数据的 index 进行排序并输出

print(df2.sort_index(axis=1, ascending=False))
'''
     F      E  D    C          B    A
0  foo   test  3  1.0 2022-01-01  1.0
1  foo  train  3  1.0 2022-01-01  1.0
2  foo   test  3  1.0 2022-01-01  1.0
3  foo  train  3  1.0 2022-01-01  1.0
'''

如果是对数据值排序输出

print(df2.sort_values(by='B'))
'''
     A          B    C  D      E    F
0  1.0 2022-01-01  1.0  3   test  foo
1  1.0 2022-01-01  1.0  3  train  foo
2  1.0 2022-01-01  1.0  3   test  foo
3  1.0 2022-01-01  1.0  3  train  foo
'''

二.Pandas选择数据

以以下矩阵数据为例

import numpy as np
import pandas as pd
dates = pd.date_range('20220101', periods=6)
df = pd.DataFrame(np.arange(24).reshape((6,4)),index=dates, columns=['A','B','C','D'])
print(df['A'])
print(df.A)

无论是df[‘A’]还是df.A都会输出以下结果

2022-01-01     0
2022-01-02     4
2022-01-03     8
2022-01-04    12
2022-01-05    16
2022-01-06    20
Freq: D, Name: A, dtype: int32

1.简单的筛选

如果我们想选取DataFrame中的数据,下面描述了两种途径, 他们都能达到同一个目的:

print(df[0:3])
'''
            A  B   C   D
2022-01-01  0  1   2   3
2022-01-02  4  5   6   7
2022-01-03  8  9  10  11
'''
print(df['20220102':'20220104'])
'''
             A   B   C   D
2022-01-02   4   5   6   7
2022-01-03   8   9  10  11
2022-01-04  12  13  14  15
'''

如果df[3:3]将会是一个空对象。后者选择20220102到20220104标签之间的数据,并且包括这两个标签。

2.根据标签 loc

同样我们可以使用标签来选择数据 loc, 本例子主要通过标签名字选择某一行数据, 或者通过选择某行或者所有行(:代表所有行)然后选其中某一列或几列数据。

print(df.loc['20220102'])
'''
A    4
B    5
C    6
D    7
Name: 2022-01-02 00:00:00, dtype: int32
'''
print(df.loc[:,['A','B']]) 
'''
             A   B
2022-01-01   0   1
2022-01-02   4   5
2022-01-03   8   9
2022-01-04  12  13
2022-01-05  16  17
2022-01-06  20  21
'''
print(df.loc['20220102',['A']])
'''
A    4
Name: 2022-01-02 00:00:00, dtype: int32'''

3.根据序列 iloc

另外我们可以采用位置进行选择 iloc, 在这里我们可以通过位置选择在不同情况下所需要的数据例如选某一个,连续选或者跨行选等操作。

print(df.iloc[3,1])
#13
print(df.iloc[3:5,1:3])
'''
             B   C
2022-01-04  13  14
2022-01-05  17  18
'''
print(df.iloc[[1,3,5],1:3])
'''
             B   C
2022-01-02   5   6
2022-01-04  13  14
2022-01-06  21  22
''' 

4.根据混合的这两种 ix(老版本可用)

当然我们可以采用混合选择 ix, 其中选择’A’和’C’的两列,并选择前三行的数据。

print(df.ix[:3,['A','C']])
"""
            A   C
2022-01-01  0   2
2022-01-02  4   6
2022-01-03  8  10
"""

5.通过判断的筛选

最后我们可以采用判断指令 (Boolean indexing) 进行选择. 我们可以约束某项条件然后选择出当前所有数据。

print(df[df.A>8])
"""
             A   B   C   D
2022-01-04  12  13  14  15
2022-01-05  16  17  18  19
2022-01-06  20  21  22  23
"""

三.Pandas 设置值

我们可以根据自己的需求, 用 pandas 进行更改数据里面的值, 或者加上一些空的,或者有数值的列.
首先建立了一个 6X4 的矩阵数据。

import numpy as np
import pandas as pd
dates = pd.date_range('20220101', periods=6)
df = pd.DataFrame(np.arange(24).reshape((6,4)),index=dates, columns=['A','B','C','D'])
print(df)
'''
             A   B   C   D
2022-01-01   0   1   2   3
2022-01-02   4   5   6   7
2022-01-03   8   9  10  11
2022-01-04  12  13  14  15
2022-01-05  16  17  18  19
2022-01-06  20  21  22  23
'''

1.根据位置设置 loc 和 iloc

我们可以利用索引或者标签确定需要修改值的位置。

df.iloc[2,2] = 1111
df.loc['20220101','B'] = 2222
'''
             A     B     C   D
2022-01-01   0  2222     2   3
2022-01-02   4     5     6   7
2022-01-03   8     9  1111  11
2022-01-04  12    13    14  15
2022-01-05  16    17    18  19
2022-01-06  20    21    22  23
'''

2.根据条件设置

如果现在的判断条件是这样, 我们想要更改B中的数, 而更改的位置是取决于 A 的. 对于A大于4的位置. 更改B在相应位置上的数为0。

df.B[df.A>4] = 0
'''
             A  B   C   D
2022-01-01   0  1   2   3
2022-01-02   4  5   6   7
2022-01-03   8  0  10  11
2022-01-04  12  0  14  15
2022-01-05  16  0  18  19
2022-01-06  20  0  22  23
'''

3.按行或列设置

如果对整列做批处理, 加上一列 ‘F’, 并将 F 列全改为 NaN, 如下:

df['F'] = np.nan
'''
             A   B   C   D   F
2022-01-01   0   1   2   3 NaN
2022-01-02   4   5   6   7 NaN
2022-01-03   8   9  10  11 NaN
2022-01-04  12  13  14  15 NaN
2022-01-05  16  17  18  19 NaN
2022-01-06  20  21  22  23 NaN
'''

4.添加数据

用上面的方法也可以加上 Series 序列(但是长度必须对齐)。

df['E'] = pd.Series([1,2,3,4,5,6], index=pd.date_range('20220101',periods=6))
'''
             A   B   C   D   F  E
2022-01-01   0   1   2   3 NaN  1
2022-01-02   4   5   6   7 NaN  2
2022-01-03   8   9  10  11 NaN  3
2022-01-04  12  13  14  15 NaN  4
2022-01-05  16  17  18  19 NaN  5
2022-01-06  20  21  22  23 NaN  6
'''

四.Pandas 处理丢失数据

有时候我们导入或处理数据, 会产生一些空的或者是 NaN 数据,如何删除或者是填补这些 NaN 数据就是我们所要提到的内容。

import numpy as np
import pandas as pd
dates = pd.date_range('20220101', periods=6)
df = pd.DataFrame(np.arange(24).reshape((6,4)),index=dates, columns=['A','B','C','D'])
df.iloc[0,1] = np.nan
df.iloc[1,2] = np.nan
print(df)
'''
             A     B     C   D
2022-01-01   0   NaN   2.0   3
2022-01-02   4   5.0   NaN   7
2022-01-03   8   9.0  10.0  11
2022-01-04  12  13.0  14.0  15
2022-01-05  16  17.0  18.0  19
2022-01-06  20  21.0  22.0  23
'''

假设上面创建的矩阵为丢失数据的矩阵

1.pd.dropna()

pd.dropna()可以直接删除丢失数据的行或列

df.dropna(
    axis=0,     # 0: 对行进行操作; 1: 对列进行操作
    how='any'   # 'any': 只要存在 NaN 就删除; 'all': 必须全部是 NaN 才删除 
    )
df.dropna(axis=0,how='any')
'''
             A     B     C   D
2022-01-03   8   9.0  10.0  11
2022-01-04  12  13.0  14.0  15
2022-01-05  16  17.0  18.0  19
2022-01-06  20  21.0  22.0  23
'''

2.pd.fillna()

pd.fillna()可以将 NaN 的值用其他值代替, 比如代替成 0

print(df.fillna(value=0))
'''
             A     B     C   D
2022-01-01   0   0.0   2.0   3
2022-01-02   4   5.0   0.0   7
2022-01-03   8   9.0  10.0  11
2022-01-04  12  13.0  14.0  15
2022-01-05  16  17.0  18.0  19
2022-01-06  20  21.0  22.0  23
'''

pd.fillna()还可以检查数据中是否存在NaN,若存在就返回True

np.any(df.isnull()) == True  
# True

五.Pandas导入导出

pandas可以读取与存取的资料格式有很多种,像csv、excel、json、html与pickle等
官方链接:Pandas官方说明文件
周莫烦老师のGitHub:示范文档下载
以读取CSV文件为例

import pandas as pd #加载模块
#读取csv
data = pd.read_csv('student.csv')
#打印出data
print(data)

将资料存取成pickle

data.to_pickle('student.pickle')

六.Pandas 合并 concat

pandas处理多组数据的时候往往会要用到数据的合并处理,使用 concat是一种基本的合并方式.而且concat中有很多参数可以调整,合并成你想要的数据形式.

1.axis (合并方向)

import pandas as pd
import numpy as np

#定义资料集
df1 = pd.DataFrame(np.ones((3,4))*0, columns=['a','b','c','d'])
df2 = pd.DataFrame(np.ones((3,4))*1, columns=['a','b','c','d'])
df3 = pd.DataFrame(np.ones((3,4))*2, columns=['a','b','c','d'])

#concat纵向合并(axis=0即纵向合并,axis=1为横向合并)
res = pd.concat([df1, df2, df3], axis=0)

#打印结果
print(res)
#     a    b    c    d
# 0  0.0  0.0  0.0  0.0
# 1  0.0  0.0  0.0  0.0
# 2  0.0  0.0  0.0  0.0
# 0  1.0  1.0  1.0  1.0
# 1  1.0  1.0  1.0  1.0
# 2  1.0  1.0  1.0  1.0
# 0  2.0  2.0  2.0  2.0
# 1  2.0  2.0  2.0  2.0
# 2  2.0  2.0  2.0  2.0

可见axis合并了df1、df2、df3为res,但是res前标重复,因此需要ignore_index重置

2.ignore_index (重置 index)

#承上一个例子,并将index_ignore设定为True
res = pd.concat([df1, df2, df3], axis=0, ignore_index=True)

#打印结果
print(res)
#     a    b    c    d
# 0  0.0  0.0  0.0  0.0
# 1  0.0  0.0  0.0  0.0
# 2  0.0  0.0  0.0  0.0
# 3  1.0  1.0  1.0  1.0
# 4  1.0  1.0  1.0  1.0
# 5  1.0  1.0  1.0  1.0
# 6  2.0  2.0  2.0  2.0
# 7  2.0  2.0  2.0  2.0
# 8  2.0  2.0  2.0  2.0

3.join(合并方式)

join预设值为outer,此方式是依照column来做纵向合并,有相同的column上下合并在一起,其他独自的column个自成列,原本没有值的位置皆以NaN填充。

import pandas as pd
import numpy as np

#定义资料集
df1 = pd.DataFrame(np.ones((3,4))*0, columns=['a','b','c','d'], index=[1,2,3])
df2 = pd.DataFrame(np.ones((3,4))*1, columns=['b','c','d','e'], index=[2,3,4])

#纵向"外"合并df1与df2
res = pd.concat([df1, df2], axis=0, join='outer')

print(res)
#     a    b    c    d    e
# 1  0.0  0.0  0.0  0.0  NaN
# 2  0.0  0.0  0.0  0.0  NaN
# 3  0.0  0.0  0.0  0.0  NaN
# 2  NaN  1.0  1.0  1.0  1.0
# 3  NaN  1.0  1.0  1.0  1.0
# 4  NaN  1.0  1.0  1.0  1.0

可以修改函数默认为inner,此时只有相同的column合并在一起,其他的会被抛弃。

#承上一个例子

#纵向"内"合并df1与df2
res = pd.concat([df1, df2], axis=0, join='inner')

#打印结果
print(res)
#     b    c    d
# 1  0.0  0.0  0.0
# 2  0.0  0.0  0.0
# 3  0.0  0.0  0.0
# 2  1.0  1.0  1.0
# 3  1.0  1.0  1.0
# 4  1.0  1.0  1.0

#重置index并打印结果
res = pd.concat([df1, df2], axis=0, join='inner', ignore_index=True)
print(res)
#     b    c    d
# 0  0.0  0.0  0.0
# 1  0.0  0.0  0.0
# 2  0.0  0.0  0.0
# 3  1.0  1.0  1.0
# 4  1.0  1.0  1.0
# 5  1.0  1.0  1.0

4.join_axes (依照 axes 合并,老版本可用)

import pandas as pd
import numpy as np

#定义资料集
df1 = pd.DataFrame(np.ones((3,4))*0, columns=['a','b','c','d'], index=[1,2,3])
df2 = pd.DataFrame(np.ones((3,4))*1, columns=['b','c','d','e'], index=[2,3,4])

#依照`df1.index`进行横向合并
res = pd.concat([df1, df2], axis=1, join_axes=[df1.index])

#打印结果
print(res)
#     a    b    c    d    b    c    d    e
# 1  0.0  0.0  0.0  0.0  NaN  NaN  NaN  NaN
# 2  0.0  0.0  0.0  0.0  1.0  1.0  1.0  1.0
# 3  0.0  0.0  0.0  0.0  1.0  1.0  1.0  1.0

#移除join_axes,并打印结果
res = pd.concat([df1, df2], axis=1)
print(res)
#     a    b    c    d    b    c    d    e
# 1  0.0  0.0  0.0  0.0  NaN  NaN  NaN  NaN
# 2  0.0  0.0  0.0  0.0  1.0  1.0  1.0  1.0
# 3  0.0  0.0  0.0  0.0  1.0  1.0  1.0  1.0
# 4  NaN  NaN  NaN  NaN  1.0  1.0  1.0  1.0

5.append(添加数据)

append 只有纵向合并,没有横向合并。

import pandas as pd
import numpy as np

#定义资料集
df1 = pd.DataFrame(np.ones((3,4))*0, columns=['a','b','c','d'])
df2 = pd.DataFrame(np.ones((3,4))*1, columns=['a','b','c','d'])
df3 = pd.DataFrame(np.ones((3,4))*1, columns=['a','b','c','d'])
s1 = pd.Series([1,2,3,4], index=['a','b','c','d'])

#将df2合并到df1的下面,以及重置index,并打印出结果
res = df1.append(df2, ignore_index=True)
print(res)
#     a    b    c    d
# 0  0.0  0.0  0.0  0.0
# 1  0.0  0.0  0.0  0.0
# 2  0.0  0.0  0.0  0.0
# 3  1.0  1.0  1.0  1.0
# 4  1.0  1.0  1.0  1.0
# 5  1.0  1.0  1.0  1.0

#合并多个df,将df2与df3合并至df1的下面,以及重置index,并打印出结果
res = df1.append([df2, df3], ignore_index=True)
print(res)
#     a    b    c    d
# 0  0.0  0.0  0.0  0.0
# 1  0.0  0.0  0.0  0.0
# 2  0.0  0.0  0.0  0.0
# 3  1.0  1.0  1.0  1.0
# 4  1.0  1.0  1.0  1.0
# 5  1.0  1.0  1.0  1.0
# 6  1.0  1.0  1.0  1.0
# 7  1.0  1.0  1.0  1.0
# 8  1.0  1.0  1.0  1.0

#合并series,将s1合并至df1,以及重置index,并打印出结果
res = df1.append(s1, ignore_index=True)
print(res)
#     a    b    c    d
# 0  0.0  0.0  0.0  0.0
# 1  0.0  0.0  0.0  0.0
# 2  0.0  0.0  0.0  0.0
# 3  1.0  2.0  3.0  4.0

七.Pandas 合并 merge

pandas中的merge和concat类似,但主要是用于两组有key column的数据,统一索引的数据. 通常也被用在Database的处理当中。

1.依据一组key合并

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']})

print(left)
#    A   B key
# 0  A0  B0  K0
# 1  A1  B1  K1
# 2  A2  B2  K2
# 3  A3  B3  K3

print(right)
#    C   D key
# 0  C0  D0  K0
# 1  C1  D1  K1
# 2  C2  D2  K2
# 3  C3  D3  K3

#依据key column合并
res = pd.merge(left, right, on='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

2.依据两组key合并

合并时有4种方法how = [‘left’, ‘right’, ‘outer’, ‘inner’],how的预设值为’inner’。
inner——只考虑相同的部分并合并
outer——不管是否相同都合并,缺少的数据用NaN代替
left——基于left的数据进行合并,若right与left相同则保留,不同则为NaN
right——基于right的数据进行合并,若left与right相同则保留,不同则为NaN

import pandas as pd

#定义资料集并打印出
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']})

print(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

print(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

#依据key1与key2 columns进行合并,并打印出四种结果['left', 'right', 'outer', 'inner']
res = pd.merge(left, right, on=['key1', 'key2'], how='inner')
print(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='outer')
print(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='left')
print(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')
print(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

3.Indicator

indicator=True会将合并的记录放在新的一列。

import pandas as pd

#定义资料集并打印出
df1 = pd.DataFrame({'col1':[0,1], 'col_left':['a','b']})
df2 = pd.DataFrame({'col1':[1,2,2],'col_right':[2,2,2]})

print(df1)
#   col1 col_left
# 0     0        a
# 1     1        b

print(df2)
#   col1  col_right
# 0     1          2
# 1     2          2
# 2     2          2

# 依据col1进行合并,并启用indicator=True,最后打印出
res = pd.merge(df1, df2, on='col1', how='outer', indicator=True)
print(res)
#   col1 col_left  col_right      _merge
# 0   0.0        a        NaN   left_only
# 1   1.0        b        2.0        both
# 2   2.0      NaN        2.0  right_only
# 3   2.0      NaN        2.0  right_only

# 自定indicator column的名称,并打印出
res = pd.merge(df1, df2, on='col1', how='outer', indicator='indicator_column')
print(res)
#   col1 col_left  col_right indicator_column
# 0   0.0        a        NaN        left_only
# 1   1.0        b        2.0             both
# 2   2.0      NaN        2.0       right_only
# 3   2.0      NaN        2.0       right_only

4.依据index合并

index即最左边的一列

import pandas as pd

#定义资料集并打印出
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'])

print(left)
#     A   B
# K0  A0  B0
# K1  A1  B1
# K2  A2  B2

print(right)
#     C   D
# K0  C0  D0
# K2  C2  D2
# K3  C3  D3

#依据左右资料集的index进行合并,how='outer',并打印出
res = pd.merge(left, right, left_index=True, right_index=True, how='outer')
print(res)
#      A    B    C    D
# K0   A0   B0   C0   D0
# K1   A1   B1  NaN  NaN
# K2   A2   B2   C2   D2
# K3  NaN  NaN   C3   D3

#依据左右资料集的index进行合并,how='inner',并打印出
res = pd.merge(left, right, left_index=True, right_index=True, how='inner')
print(res)
#     A   B   C   D
# K0  A0  B0  C0  D0
# K2  A2  B2  C2  D2

5.解决overlapping(部分重叠)的问题

使用suffixes解决overlapping的问题。
比如这个数据中boys和girls出现‘age’重复

import pandas as pd

#定义资料集
boys = pd.DataFrame({'k': ['K0', 'K1', 'K2'], 'age': [1, 2, 3]})
girls = pd.DataFrame({'k': ['K0', 'K0', 'K3'], 'age': [4, 5, 6]})

#使用suffixes解决overlapping的问题
res_1 = pd.merge(boys, girls, on='k', suffixes=['_boy', '_girl'], how='inner')
print(res_1)
#    age_boy   k  age_girl
# 0        1  K0         4
# 1        1  K0         5
res_2 = pd.merge(boys, girls, on='k', suffixes=['_boy', '_girl'], how='outer')
print(res_2)
'''
    k  age_boy  age_girl
0  K0      1.0       4.0
1  K0      1.0       5.0
2  K1      2.0       NaN
3  K2      3.0       NaN
4  K3      NaN       6.0
'''

八.Pandas plot 出图

matplotlib可用于数据可视化。

1.Series可视化

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 随机生成1000个数据
data = pd.Series(np.random.randn(1000),index=np.arange(1000))
 
# 为了方便观看效果, 我们累加这个数据
data.cumsum()

# pandas 数据可以直接观看其可视化形式
data.plot()#学习matplotlib后可以在plot中加入参数改变图像属性

plt.show()

如果需要plot一个数据,我们可以使用 plt.plot(x=, y=),把x,y的数据作为参数存进去,但是data本来就是一个数据,所以我们可以直接plot。

2.Dataframe 可视化

data = pd.DataFrame(
    np.random.randn(1000,4),
    index=np.arange(1000),
    columns=list("ABCD")
    )
data.cumsum()
data.plot()
plt.show()

除了plot在 pandas 中有其他绘图方法:
bar
hist
box
kde
area
scatter
hexbin

你可能感兴趣的:(笔记,机器学习,python,数据挖掘)