Python第三方库Pandas简述

199 阅读5分钟

Pandas来源于面板数据(Panel Data)和数据分析(Data Analysis)。

一般按如下方式导入:

import numpy as np
import pandas as pd

读数据

1、csv和txt

df = pd.read_csv(filename)

还有read_txt,但是合并为了read_csv(csv格式的文件用记事本打开就明白了),参数解析:

pd.read_csv(
    filename, # 指定文件位置
    sep=',',  # 指定文件中数据分割符
    header='infer', # 默认将数据集首行作为表头(列名),若数据集无表头,则需设置为None
    names=None,     # 当header=None,通过names手动指定列名
    index_col=None, # 指定某列作为行索引,默认生成0,1,2...的索引
    use_cols=None,  # 指定需要读取的列
    converters=None, # 通过字典为某些列设置不同的数据格式
    skiprows=0,     # 读取数据时,指定要跳过的数据集起始行数
    skipfooter=0,   # 读取数据时,指定要跳过的数据集末尾行数
    nrows=None,     # 读取数据时,指定要读取的行数,默认为全部
    comment=None,   # 指定注释符,读取数据时,行首为该字符,则跳过改行
    encoding=None)  # 设置编码格式,可解决中文乱码问题('utf-8' or 'gbk')

更多见:pandas.pydata.org/docs/user_g…

例:

D盘myfiles目录有个文件test.csv,内容如下:

image.png

dirname = r'D:\myfiles' # r使字符串中的转义字符 '\' 失效
df = pd.read_csv(
    dirpath + r'\test.csv', 
    sep=';', 
    header=None, 
    names=['编号', '姓名', '年龄'])
print(df.head())

输出:

                       编号   姓名    年龄
0  这是一个用于测试pd.read_csv的文件  NaN   NaN
1     这两行可以用于测试skiprows参数  NaN   NaN
2                   00848  张龙山  25.0
3                  #00958  杨想龙  21.0
4                   00135  张山阳  26.0

指定更多参数:

dirname = r'D:\myfiles' # r使字符串中的转义字符 '\' 失效
df = pd.read_csv(
    dirpath + r'\test.csv',
    sep=';',
    skiprows=2,
    skipfooter=2,
    header=None,
    names=['编号', '姓名', '年龄'],
    index_col='编号',
    converters={'编号': str, '年龄': int},
    comment='#'
)
print(df.head())

输出:

      姓名  年龄
编号          
848  张龙山  25
135  张山阳  26
910  白阳想  21
251  赵国丽  21
116  杨阳山  27

有个警告:ParserWarning: Falling back to the 'python' engine because the 'c' engine does not support skipfooter; you can avoid this warning by specifying engine='python',即'C' engine 不支持skipfooter参数。

2、excel

当读取excel时还依赖库 openpyxl和xlrd,如果读取失败可以尝试pip install一下这两个库。

pd.read_excel 相比pd.read_csv,有个sheet_name参数,因为一个excel文件可以有多个sheet,该参数可以是数字,代表下标(0,1,2...),也可以是字符串,代表名字(sheet1, sheet2...),默认读取第一个sheet,当指定为None时,读取所有sheet(此时可以获取所有sheet的name:df.keys() or list(df))。

3、DataFrame

不论是 txt、csv还是excel,pandas读取后返回的都是一个DataFrame势力对象,该对象非常强大,可以进行统计、筛选、抽样等。

属性:

df.shape # 数据规模(行,列) (7, 2) 
df.index # 行索引
df.columns # 列

方法:

df.head(n) #查看前几行,无参时默认是前5条数据
df.tail() #反之
df.info() # 整体信息:
'''
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 7 entries, 0 to 6
Data columns (total 3 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   编号      7 non-null      int64 
 1   姓名      7 non-null      object
 2   年龄      7 non-null      int64 
dtypes: int64(2), object(1)
memory usage: 296.0+ bytes
'''
df.describe() # 对 int、float等列的统计信息
'''
               编号         年龄
count    7.000000   7.000000 #个数
mean   574.142857  23.285714 #均值
std    383.963292   2.627691 #标准差
min    116.000000  21.000000 #最小值
25%    193.000000  21.000000 #中低位数
50%    840.000000  22.000000 #中位数
75%    879.000000  25.500000 #中高位数
max    919.000000  27.000000 #最大值
'''
df.isnull() # 是否为null,后面可以跟 .sum() 进行统计
df.duplicated() # 某行是否重复
df = df.set_index(col_name) # 将某列设置为索引(返回新DataFrame对象),df = df.reset_index()重置索引

#### 数据选取(loc 和 iloc,l是label的意思,i是index的意思)
df[xx] # xx 可以为字符串,表示提取某列;如果是数字,表示是第几行(可以是下标区间 [1:3] 左闭右开),例:
df['编号'] # 提取编号一列数据
df[1:3] # 提取第1、2行数据
# 如果需要同时筛选 行和列,则需要用到 loc or iloc
df.loc[1:3, ['编号', '姓名']] # 此处是左闭右闭(因为是label),即 第1、2、3行的 编号、姓名 列
'''
    编号   姓名
1  135  张山阳
2  910  白阳想
3  251  赵国丽
'''
df.iloc[1:3, [1, 2]] # 此处是左闭右开(因为是下标),即 下标1、2行的 下标1、2列
'''
    姓名  年龄
1  张山阳  26
2  白阳想  21
'''
df = df.set_index('姓名')
df.loc[['张山阳', '赵国丽'], :] # 提取指定索引的所有列
'''
      编号  年龄
姓名          
张山阳  135  26
赵国丽  251  21
'''
df=df.reset_index() # 重置索引
df[df['姓名'].str.startswith('张')] # 提取姓 张 的数据
'''
    姓名   编号  年龄
0  张龙山  848  25
1  张山阳  135  26
'''
df[df['年龄'] > 25] # 提取 年龄大于 25 的数据
'''
    姓名   编号  年龄
1  张山阳  135  26
4  杨阳山  116  27
'''
df[(df['姓名'].str.startswith('张')) & (df['年龄'] > 25)] # 提取年龄大于25的姓张的数据(注意每个条件用括号括起来,用 & 连接
'''
    姓名   编号  年龄
1  张山阳  135  26
'''
df.loc[(df['姓名'].str.startswith('张')) & (df['年龄'] > 25), ['编号']] #提取年龄大于25的姓张的编号
'''
    编号
1  135
'''

写数据

DataFrame对象有 to_csv(...), to_excel(...)等方法。

若想保存到同一个excel的不同sheet中:

writer = pd.ExcelWriter('test.xlsx')
df = pd.DataFrame({
    '编号': [256, 346, 753],
    '姓名': ['张龙山', '张山', '冯梦丽'],
    '年龄': [18, 20, 19]
})
df1 = df.loc[:, ['编号', '姓名']]
df1.to_excel(writer, sheet_name='编号和姓名')

df2 = df.loc[:, ['编号', '年龄']]
df2.to_excel(writer, sheet_name='编号和年龄')

writer.save()
writer.close()

B站链接:www.bilibili.com/video/BV1uL…