Pandas总结
一 模块导入
import pandas as pd
二 数据创建
2.1 Series数据结构(一维)
(1)创建
index:索引,默认创建一个从0-N的整数索引
# pd.Series(data=None, index=None, dtype=None)
# 通过字典数据创建
data = pd.Series({'age':10, 'name':peter, 'gender': male)
(2)属性
a) 索引
data.index
b) 值
data.values
data[2]
2.2 DataFrame数据结构(二维)
(1)创建
index行索引,columns列索引
pd.DataFrame(data=None, index=None, columns=None)
(2)属性
a) 行索引
data.index
b) 形状
data.shape
c) 列索引
data.columns
d) 值
data.values
e) 转置
data.T
f) 显示前n行内容
head(n):默认5行
f) 显示后n行内容
tail(n):默认5行
(3)索引的设置
a)修改行列索引值
必须整体全部修改
stu_id = ["00"+ str(i) for i in range(20)]
data.index = stu_id
b)重设索引
reset_index(drop=False)
drop:默认为False,不删除原来索引,如果为True,删除原来的索引值
c) 将某列值设为新索引
set_index(keys, drop=True)
keys : 列索引名
drop :默认为True,删除原来的索引
2.3 MultiIndex数据结构(三维)
(1)创建
a) from_arrays()
arrays = [[1, 2, 3, 4], [18, 45, 23, 23]]
pd.MultiIndex.from_arrays(arrays, names=('num', 'age'))
b) from_tuple()
> tuples = [('A','a'),('A','b'),('B','a'),('B','b')]
mul_index = pd.MultiIndex.from_tuples(tuples, names=('Upper', 'Lower'))
c) from_product()
> L1 = ['A','B']
L2 = ['a','b']
pd.MultiIndex.from_product([L1,L2],names=('Upper', 'Lower'))
# 两两相乘
(2)属性
names:索引的名称
levels:每个level的元组值
MultiIndex(levels=[[1, 2, 3, 4], [18, 23, 45]],
codes=[[0, 1, 2, 3], [0, 2, 1, 1]],
names=['num', 'age'])
三 数据基本操作
3.1 索引操作
(1)直接索引
先列后行,直接索引不可使用下标
data['name']['001']
(2)loc和iloc
loc使用索引名称,先行后列
data.loc['001':'005', ['name','age']]
iloc使用索引下标,先行后列
data.iloc[:3, :5]
(3)ix组合索引
data.ix[0:4, ['name', 'age', 'gender']]
3.2 赋值
# 将age这一列所有值修改成18
data['age'] = 18
3.3 排序
dataframe.sort_values(by=, ascending=)
by:指定排序参考的键
ascending=False:降序
ascending=True:升序,默认升序
# 按照总成绩升序
data.sort_values(by="sum_score", ascending=True)
# 按照总成绩和语文成绩进行降序排序,若总成绩一样,按照语文成绩排序
data.sort_values(by=['sum_score', 'chinese_score'],ascending=False)
dataframe.sort_index()
按索引进行排序
data.sort_index()
3.4 逻辑运算
(1)算数运算
加:add(num)
减:sub(num)
# 该列的每一行都加10
data['score'].add(10)
(2)逻辑运算
query(‘表达式’)
data.query("score<90 & score>80")
isin(values)
# 判断score是否为95和90
data[data["score"].isin([95, 90])]
3.5 统计运算
(1)综合统计(describe)
能统计出count, mean, std, min, max 等结果
data.describe()
(2)统计函数
median(中位数), var(方差), std(标准差),mode(众数)
idxmax()、idxmin():最大值,最小值的下标,prod:列数据的连乘积
# 0或1按行或按列统计,默认0
data.max(0)
*(3)自定义运算
apply(func, axis=0)
func:自定义函数
# 最高分减最低分
data['score'].apply(lambda x: x.max() - x.min(), axis=0)
四 pandas画图
DataFrame.plot(kind=‘line’)
kind : 图形的种类
‘line’ : line plot (default) 折线图
‘bar’ : vertical bar plot 条形图
‘barh’ : horizontal bar plot 横条形图
‘hist’ : histogram 直方图
‘pie’ : pie plot 饼图
‘scatter’ : scatter plot 散点图
data.plot()
五 文件读取和存储
常用的有CSV,HDF5和JSON
5.1 CSV
(1) 读取
pd.read_csv(filepath_or_buffer, usecols=)
filepath_or_buffer:文件路径
usecols:读取哪几列
data = pd.read_csv("./student_score.csv", usecols=['name', 'score'])
(2) 保存
DataFrame.to_csv(path_or_buf=None, sep=’, ’, columns=None, header=True, index=True, mode=‘w’, encoding=None)
path_or_buf:文件路径
sep:分隔符,默认用","隔开
columns:保存哪几列
header:是否保留列索引,默认为True
index:是否保留行索引
mode:'w’重写, ‘a’ 追加
data.to_csv("./test.csv", columns=['score'], index=False)
5.2 HDF5
(1) 读取
pandas.read_hdf(path_or_buf,key =None,** kwargs)
path_or_buffer:文件路径
key:读取的键
data = pd.read_hdf("./student_info.h5")
(2) 保存
DataFrame.to_hdf(path_or_buf, key, **kwargs)
data.to_hdf("./test.h5", key="student_id")
5.3 JSON
(1) 读取
pandas.read_json(path_or_buf=None, orient=None, typ=‘frame’, lines=False)
orient : 数据显示的形式
a) split 索引,列名数据三块分开了
b) ‘records’ : 以columns:values的形式输出
c) ‘index’ : 以index:{columns:values}…的形式输出
d) ‘columns’ : 以columns:{index:values}的形式输出
e) ‘values’ : 直接输出值
lines : 按行读取
typ : default ‘frame’, 指定转换成的类型series或dataframe
json_read = pd.read_json("./student_info.json", orient="records", lines=True)
(2) 保存
DataFrame.to_json(path_or_buf=None, orient=None, lines=False)
orient:存储的json形式
lines:按行存储
json_read.to_json("./test.json", orient='records')
5.4 几种文件读取方法的区别
这里的内容引用了这篇文章:https://www.cnblogs.com/cymwill/p/8289367.html
(1)read_sql:读数据库(通过SQL语句或者表名)
pd.read_sql(sql, con, index_col=None, coerce_float=True, params=None, parse_dates=None, columns=None, chunksize=None)
(2)read_sql_table:读取整张表
pd.read_sql_table(table_name, con, schema=None, index_col=None, coerce_float=True, parse_dates=None, columns=None, chunksize=None)
(3)read_sql_query:read_sql_query()中可以接受SQL语句,包括增删改查
pandas.read_sql_query(sql, con, index_col=None, coerce_float=True, params=None, parse_dates=None,chunksize=None)
总结:read_sql是综合了read_sql_table和read_sql_query
(4)read_csv()和read_table()
read_csv() 读取以‘,’分割的文件到DataFrame
read_table()读取以‘/t’分割的文件到DataFrame
*六 缺失值处理
6.1 判断是否存在缺失值nan
(1)pd.isnull()
返回True和False,其中缺失值为True
(2)pd.notnull()
返回True和False,其中缺失值为False
(3)isnull和np.any结合
# 有缺失值,返回True
np.any(pd.isnull(data))
(4)notnull和np.all结合
# 有缺失值,返回False
np.all(pd.notnull(data))
6.2 缺失值用其他符号表示
将其他符号标记的缺失值用nan进行替换
data.replace(to_replace=, value=)
to_replace:替换前的值
value:替换后的值
data = data.replace(to_replace='?', value=np.nan)
6.3 缺失值处理
(1)删除
pandas删除缺失值,但前提是缺失值的类型必须是np.nan,并且不会修改原数据,用新变量承接
data = student_info.dropna()
(2)替换缺失值
fillna(value, inplace=True)
value:替换成的值
inplace:True:会修改原数据,False:不替换修改原数据,生成新的对象
# 替换某一列数据
student_info['age'].fillna(student_info['age'].mean(), inplace=True)
# 替换所有
for i in student_info.columns:
if np.all(pd.notnull(student_info[i])) == False:
student_info[i].fillna(student_info[i].mean(), inplace=True)
七 离散化
7.1 划分区间
pd.qcut(data, q):
将数据平均分组,q为区间个数,
data.value_counts():统计分组次数
qcut = pd.qcut(data, 5)
# 计算分到每个组数据个数
qcut.value_counts()
pd.cut(data, bins)
自定义分组区间
bins = [0, 5, 15, 30, 50, 100]
p_counts = pd.cut(data, bins)
7.2 one-hot编码
pd.get_dummies(data, prefix=None)
data:分组后的数据
prefix:分组名字
dummies = pd.get_dummies(p_counts, prefix="group")
八 数据表合并
(1)pd.concat
pd.concat([data1, data2], axis=1)
按照行或列进行合并,axis=0为列索引,axis=1为行索引
pd.concat([data, dummies], axis=1)
(2)pd.merge
pd.merge(left, right, how=‘inner’, on=None)
left: 左表
right: 右表
on: 指定的共同键
how:按照什么方式连接,有’left’(左连接),‘right’(右连接),‘inner’(内连接),‘outer’(外连接)
九 交叉表与透视表
交叉表:计算一列数据对于另外一列数据的分组个数
透视表:指定某一列对另一列的关系,百分比
# 交叉表
count = pd.crosstab(data['weekday'], data['is_pass'])
# 透视表
data.pivot_table(['is_pass'], index='weekday')
**十 分组聚合
data.groupby(key, as_index=True
key:分组的列数据,可以多个
as_index:是否删除原索引,False保留,True删除
# 两种方式,先分组在聚合
col.groupby(['name'])['score'].mean()
col['score'].groupby(col['name']).mean()