跳至正文
View Categories

1 min read

主要内容 #

  1. 了解Pandas的一些日常用法,如处理缺失值、导入导出等。
  2. 掌握Pandas的数据合并。

1. Pandas的缺失值处理 #

有时候我们导入或处理数据, 会产生一些空的或者是 NaN 数据,如何删除或者是填补这些 NaN 数据就是我们今天所要提到的内容。
首先,建立了一个6X4的矩阵数据并且把两个位置置为空。

dates = pd.date_range('20230101', periods=6)
df = pd.DataFrame(np.arange(24).reshape((6,4)),index=dates, columns=['A','B','C','D'])
#通过np.nan来设置空值
df.iloc[0,1] = np.nan
df.iloc[1,2] = np.nan
  • (1):pd.dropna()

如果想直接去掉有NaN的行或列,可以直接使用dropna()

df.dropna(
    axis=0,     # 0: 对行进行操作; 1: 对列进行操作
    how='any'   # 'any': 只要存在 NaN 就 drop 掉; 'all': 必须全部是 NaN 才 drop 
    )
  • (2):pd.fillna()

如果是将 NaN 的值用其他值代替, 比如代替成 0,可以用fillna():

df.fillna(value=0)
  • (3):pd.isnull()

判断是否有缺失数据 NaN, 为 True 表示缺失数据:

df.isnull()

2. Pandas 数据导入与导出 #

pandas可以读取与存取的资料格式有很多种,像csv、excel、json、html与pickle等…

      • (1):读取csv

在自己目录下创建一个csv文件,命名为student.csv
则读取代码如下:

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

pd.read_csv()有多种参数,其中比较重要的有:
* sep:读取csv文件时指定的分隔符,默认为逗号。如果是文本文件,则sep=’\t’。
* usecols:如果一个数据有很多列,但是我们在读取的时候只想要其中的某几列,就可以使用这个参数。

pd.read_csv('student.csv',sep=',',usecols=['name','class'])
      • (2):将dataframe存储成csv或pickle
data.to_csv('student.csv')
data.to_pickle('student.pickle')

pd.to_csv()与read_csv()一样有很多参数,其中最有用的参数为:
* sep:分隔符,如果sep=’\t’,则保存的是以\t为分隔符的文件
* index:是否保留行索引,默认为True,若不保留则index=0

3. Pandas合并DataFrame #

      • (1):Pandas合并 concat

pandas处理多组数据的时候往往会要用到数据的合并处理,使用 concat是一种基本的合并方式.而且concat中有很多参数可以调整,合并成你想要的数据形式。
axis为合并方向,默认为axis=0,即按行合并;axis=1,则为按列合并

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纵向合并
res = pd.concat([df1, df2, df3], axis=0)
#concat横向合并
res = pd.concat([df1, df2, df3], axis=1)

join(合并方式)
join=’outer’为预设值,因此未设定任何参数时,函数默认join=’outer’。此方式是依照column来做纵向合并,有相同的column上下合并在一起,其他独自的column个自成列,原本没有值的位置皆以NaN填充。

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')
#纵向"内"合并df1与df2
res = pd.concat([df1, df2], axis=0, join='inner')
#重置index并打印结果
res = pd.concat([df1, df2], axis=0, join='inner', ignore_index=True)
      • (2):Pandas合并 merge

pandas中的merge和concat类似,但主要是用于两组有key column的数据,统一索引的数据。通常也被用在Database的处理当中。
合并时有4种方法how = [‘left’, ‘right’, ‘outer’, ‘inner’],预设值how=’inner’。
依据一组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']})
#依据key column合并,并打印出
res = pd.merge(left, right, on='key')
#依据不同column名来合并
res = pd.merge(left,right,left_on='A', right_on='C',how='inner')

依据两组key合并:

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

3. 小结 #

      • 熟悉并掌握Pandas的一些日常用法,如处理缺失值、导入导出等
      • 熟悉掌握Panda合并的两种用法:concat和merge

习题 #