Pandas总结

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()
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值