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,内容如下:
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()