Pandas
2021-10-28 15:04:57 4 举报
AI智能生成
Pandas知识脉络,请收藏,持续更新
作者其他创作
大纲/内容
引入
参考资料
Pandas菜鸟教程
Pandas官方文档
安装
普通环境
隔离环境
conda install pandas
导入
import pandas as pd
一维数据结构
Series
Series
格式
pd.Series( data, index, dtype, name, copy)
参数说明
name
设置名称
index
数据索引标签,如果不指定,默认从 0 开始
a = ["Google", "Runoob", "Wiki"]
myvar = pd.Series(a, index = ["x", "y", "z"])
print(myvar["y"])
myvar = pd.Series(a, index = ["x", "y", "z"])
print(myvar["y"])
使用列表创建
a = [1, 2, 3]
myvar = pd.Series(a)
myvar = pd.Series(a)
使用字典创建
sites = {1: "Google", 2: "Runoob", 3: "Wiki"}
myvar = pd.Series(sites, index = [1, 2])
myvar = pd.Series(sites, index = [1, 2])
字典的 key 变成了索引值。
如果我们只需要字典中的一部分数据,只需要指定需要数据的索引即可
如果我们只需要字典中的一部分数据,只需要指定需要数据的索引即可
转换成list
s.tolist()
二维数据结构
DataFrame
DataFrame
特点
每列可以是不同的值类型, 既有行索引也有列索引
格式
pd.DataFrame( data, index, columns, dtype, copy)
参数说明
index
索引值,或者可以称为行标签
columns
列标签,默认为 RangeIndex (0, 1, 2, …, n)
从列表创建
data = [['Google',10],['Runoob',12],['Wiki',13]]
df = pd.DataFrame(data,columns=['Site','Age'],dtype=float)
df = pd.DataFrame(data,columns=['Site','Age'],dtype=float)
从字典创建
data = {'Site':['Google', 'Runoob', 'Wiki'], 'Age':[10, 12, 13]}
df = pd.DataFrame(data)
df = pd.DataFrame(data)
字典不等长,直接转DataFrame会报错
如果字典只有一个值,那么要传递index参数,说明行索引是什么
pd.DataFrame(dummy_most_frequent_train['weighted avg'],
index=[0])
index=[0])
创建空PD
参考资料
Pandas创建一个空DataFrame,并逐行插入数据
#创建一个空的Dataframe
result =pd.DataFrame(columns=('idx','degree','weight','diameter'))
#将计算结果逐行插入result,注意变量要用[]括起来,同时ignore_index=True,否则会报错,
# ValueError: If using all scalar values, you must pass an index
for i in idx:
degree=
weight=
diameter=
result=result.append(pd.DataFrame({'idx':[i],'degree':[degree],'weight':[weight],'diameter':[diameter]}),ignore_index=True)
result =pd.DataFrame(columns=('idx','degree','weight','diameter'))
#将计算结果逐行插入result,注意变量要用[]括起来,同时ignore_index=True,否则会报错,
# ValueError: If using all scalar values, you must pass an index
for i in idx:
degree=
weight=
diameter=
result=result.append(pd.DataFrame({'idx':[i],'degree':[degree],'weight':[weight],'diameter':[diameter]}),ignore_index=True)
从df创建
参考资料
Python pandas.DataFrame.copy函数方法的使用
copy
格式
df.copy(deep=True)
从Series创建
参考资料
pandas中Series转成DataFrame格式
数据存取
TXT
读取
df = read_table('./texting.csv', sep=',')
参数
注意要加sep分隔符
JSON
读取
df = pd.read_json('sites.json')
返回DataFrame
存储
内嵌数据
df_nested_list = pd.json_normalize(data, record_path =['students'])
展开stuents列的内嵌数据
CSV
读取
格式
pd.read_csv(filepath_or_buffer, sep=', ', delimiter=None, header='infer', ...)
参数
header
对无表头的数据,需设置header=None,否则第一行数据被作为表头
对无表头的数据,设置header=None,表头会默认设置为[0,1,2,3,...]
对有表头的数据,设置header=None会报错
对无表头的数据,设置header=None,表头会默认设置为[0,1,2,3,...]
对有表头的数据,设置header=None会报错
实例
df = pd.read_csv('nba.csv')
返回DataFrame
存储
df.to_csv('site.csv')
df.to_csv('site.txt')
EXCEL
读取
read_excel()
存储
to_excel()
HTML
读取
read_html()
存储
to_html()
SQLite3
参考资料
Pandas 读写sqlite数据库
Jupyter中使用pandas链接Mysql报错解决:No module named 'sqlalchemy'
安装
conda install sqlalchemy
读取
import pandas as pd
from sqlalchemy import create_engine
engine = create_engine('sqlite:///cba_log_rv.sqlite')
log_rv = pd.read_sql('log_rv',engine) # 第一个参数是表名
from sqlalchemy import create_engine
engine = create_engine('sqlite:///cba_log_rv.sqlite')
log_rv = pd.read_sql('log_rv',engine) # 第一个参数是表名
实例
数据定位
参考资料
Python pandas 中loc函数的意思及用法,及跟iloc的区别
pandas取dataframe特定行/列
取特定行
取特定列
df['column_name'] 或者 df.column_name
df[['column_name_1','column_name_2']]
使用条件表达式
选择特定的行
选择特定的行
格式
df[condition]
ix
解释
可以使用整数也可以使用索引进行定位
在0.20.0之后已经不推荐使用,建议使用iloc和loc
iloc
格式
df.iloc[row_position, column_position]
解释
主要用于使用整数进行位置定位
输入
单个整数
5
整数列表或者数组
[4, 3, 0]
切片对象
1:7
不同于一般的python切片,start和stop都包括
实例
loc
格式
df.loc[index,column]
解释
主要用于label和boolean,也即index和columns的label
输入
单个标签
5或者'a',这里的5是指索引
标签列表或者数组
['a', 'b', 'c']
切片
'a':'f'
不同于一般的python切片,start和stop都包括
实例
query
格式
实例
searchsorted
格式
s.searchsorted(value, side='left', sorter=None)
解释
查找一个值在序列中应该插入的位置
可以用来找特定值在这个序列中的位置
没有合适的位置时返回1或者序列长度
参数
side
'left'
找到的第一个合适位置
'right'
找到的最后一个合适位置
iat
at
where
参考资料
pandas where函数用法
格式
df.where(cond, other=nan, inplace=False, axis=None,
level=None, errors='raise', try_cast=NoDefault.no_default)
level=None, errors='raise', try_cast=NoDefault.no_default)
解释
替代某些值
参数
cond
true, false 序列, 对应每个元素
other
cond为false的元素的值替换为other
inplace
实例
mask
数据排序
参考资料
Pandas系列教程(8)pandas数据排序
pandas按照列的值排序(某一列或者多列)
sort_values
格式
df.sort_values(by, axis=0, ascending=True, inplace=False,
kind='quicksort', na_position='last', ignore_index=False, key=None)
kind='quicksort', na_position='last', ignore_index=False, key=None)
s.sort_values(axis=0, ascending=True, inplace=False,
kind='quicksort', na_position='last', ignore_index=False, key=None)
kind='quicksort', na_position='last', ignore_index=False, key=None)
解释
参数
by
Series的sort_values没有这个参数
ascending
Series
默认为True升序排列,为Flase降序排序
DataFrame
bool或者list,升序还是降序,如果是list对应by的多列
inplacce
是否修改原始的DataFrame
数据类型
时间
参考资料
01-pandas时间类型dt类属性及方法
pandas时间序列——时间基础、时间增量、时间周期、日期偏移处理
pandas的to_datetime时间转换使用方法以及学习的心得
time data '2018-07-01' does not match format '%y-%m-%d'
转换成datetime类型
基本使用
data['date_parsed'] = pd.to_datetime(data['date'],format="%m/%d/%y")
实例
获取年份
df['column_name'].dt.year
获取月份
df['column_name'].dt.year
获取周几
df['column_name'].dt.year
时间增量
Dateoffset
参考资料
Dateoffset 官方文档
基本使用
from pandas.tseries.offsets import DateOffset
ts = pd.Timestamp('2017-01-01 09:10:11')
ts + DateOffset(months=3)
ts = pd.Timestamp('2017-01-01 09:10:11')
ts + DateOffset(months=3)
获取当前时间
数据信息
head(n=5)
print(df.head())
tail(n=5)
print(df.tail())
info()
print(df.info())
describe()
统计信息
平均值 mean()
x = df["ST_NUM"].mean()
中位数 median()
众数 mode()
shape
(行数,列数)
unique()
实例
解释
返回series里面所有的值(去掉重复值)
value_counts()
实例
解释
返回Series里面的值和出现的次数
行信息
df.index
列信息
df.columns
dtypes
返回一个Series,有各列的种类信息
数据运算
逻辑运算符
参考资料
pandas 的逻辑运算符 不能用 and or not
&
|
~
实例
data.iloc[(data.loc[:,'Elevation']>= a) & (data.loc[:,'Elevation'] <= b)]
比较运算符
实例
data.loc[:,'Elevation']>= a
数据合并
concat()
格式
pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,
keys=None, levels=None, names=None, verify_integrity=False, copy=True):
keys=None, levels=None, names=None, verify_integrity=False, copy=True):
解释
最强大,可用于横向和纵向合并拼接
默认纵向拼接
参数解析
objs
需要连接的对象集合,一般是列表或字典;
axis
axis=0代表纵向合并,axis=1代表横向合并
keys
创建多层索引
join
参数为‘outer’或‘inner’;
ignore_index=True
重建索引
实例
df = pd.concat([df1, df2])
merge()
格式
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True,
suffixes=('_x', '_y'), copy=True, indicator=False)
left_index=False, right_index=False, sort=True,
suffixes=('_x', '_y'), copy=True, indicator=False)
解释
最常用,主要用于基于列的横向合并(合并列)
参数解析
left和right
两个不同的DataFrame
how
连接方式,有inner、left、right、outer,默认为inner
on
指的是用于连接的列索引名称,必须存在于左右两个DataFrame中,
如果没有指定且其他参数也没有指定,则以两个DataFrame列名交集作为连接键;
如果没有指定且其他参数也没有指定,则以两个DataFrame列名交集作为连接键;
left_on
左侧DataFrame中用于连接键的列名,这个参数左右列名不同但代表的含义相同时非常的有用;
right_on
右侧DataFrame中用于连接键的列名
left_index
使用左侧DataFrame中的行索引作为连接键
right_index
使用右侧DataFrame中的行索引作为连接键
sort
默认为True,将合并的数据进行排序,设置为False可以提高性能
suffixes
字符串值组成的元组,用于指定当左右DataFrame存在相同列名时在列名后面附加的后缀名称,默认为('_x', '_y')
copy
默认为True,总是将数据复制到数据结构中,设置为False可以提高性能
indicator
显示合并数据中数据的来源情况
实例
pd.merge(left, right)
join()
格式
df.join(other, on=None, how='left', lsuffix='', rsuffix='',sort=False)
解释
最简单,主要用于基于索引的横向合并(不会增加新行)
参数
how
连接方式,有inner、left、right、outer,默认为inner
on
指的是用于连接的列索引名称,必须存在于左右两个DataFrame中,
如果没有指定且其他参数也没有指定,则以两个DataFrame列名交集作为连接键;
如果没有指定且其他参数也没有指定,则以两个DataFrame列名交集作为连接键;
sort
默认为True,将合并的数据进行排序,设置为False可以提高性能
lsuffix
字符串值组成的元组,用于指定当左右DataFrame存在相同列名时在列名后面附加的后缀名称
rsuffix
字符串值组成的元组,用于指定当左右DataFrame存在相同列名时在列名后面附加的后缀名称
实例
df1.join(df2)
combine_first()
append()
格式
df.append(other, ignore_index=False, verify_integrity=False, sort=False)
解释
主要用于纵向追加,增加一行
实例
增加一列
参考资料
pandas新增一列作为id,或者新增有默认值的一列
nlist = range(1,n)
data['id'] = nlist
data['label'] = 0
data['id'] = nlist
data['label'] = 0
数据变换
转置
df.T
概述
行列变换(Pivoting)
stack()
格式
df.stack(level=-1, dropna=True)
unstack()
格式
df.unstack(level=-1, fill_value=None)
举例
pivot()
格式
df.pivot(index=None, columns=None, values=None)
参数
index
Index就是层次字段,要通过透视表获取什么信息就按照相应的顺序设置字段
values
Values可以对需要的计算数据进行筛选
columns
类似Index可以设置列层次字段,它不是一个必要参数,作为一种分割数据的可选方式
pivot_table()
格式
pd.pivot_table(data, values=None, index=None, columns=None,aggfunc='mean',
fill_value=None, margins=False, dropna=True, margins_name='All')
fill_value=None, margins=False, dropna=True, margins_name='All')
参数
index
Index就是层次字段,要通过透视表获取什么信息就按照相应的顺序设置字段
values
Values可以对需要的计算数据进行筛选
aggfunc
参数可以设置我们对数据聚合时进行的函数操作
columns
类似Index可以设置列层次字段,它不是一个必要参数,作为一种分割数据的可选方式
实例
table=pd.pivot_table(df,index=[u'对手',u'胜负'],columns=[u'主客场'],values=[u'得分',u'助攻',u'篮板'],
aggfunc={u'得分':np.mean, u'助攻':[min, max, np.mean]},fill_value=0)
aggfunc={u'得分':np.mean, u'助攻':[min, max, np.mean]},fill_value=0)
数据清洗
参考资料
pandas删除某大于 数_详解pandas如何去掉、过滤数据集中的某些值或者某些行?...
删除数据
drop()
格式
df.drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors='raise')
解释
删除一行或一列
参数
labels
labels要配合axis使用,默认删除行索引数据
axis
0删除横向数据,1删除纵向数据
index
labels, axis=0 相当于 index=labels
columns
labels, axis=1 相当于 columns=labels
del
解释
删除一列
实例
del frames1['ball']
清洗空值
判断空值
isnull()
如果是NaN,返回布尔值True的DataFrame
notnull()
如果不是NaN,返回True
解释
经常在filters里面使用([]里面,用作定位)
移除空值的行
格式
df.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
参数说明
axis:默认为 0,表示逢空值剔除整行,如果设置参数 axis=1 表示逢空值去掉整列。
how:默认为 'any' 如果一行(或一列)里任何一个数据有出现 NA 就去掉整行,如果设置 how='all' 一行(或列)都是 NA 才去掉这整行
thresh:设置需要多少非空值的数据才可以保留下来的。
subset:设置想要检查的列。如果是多个列,可以使用列名的 list 作为参数。
inplace:如果设置 True,将计算得到的值直接覆盖之前的值并返回 None,修改的是源数据。
替换空值的字段
格式
df.fillna(value, inplace=False)
使用均值替换
x = df["ST_NUM"].mean()
df["ST_NUM"].fillna(x, inplace = True)
df["ST_NUM"].fillna(x, inplace = True)
使用中位数替换
x = df["ST_NUM"].median()
df["ST_NUM"].fillna(x, inplace = True)
df["ST_NUM"].fillna(x, inplace = True)
使用众数替换
x = df["ST_NUM"].mode()
df["ST_NUM"].fillna(x, inplace = True)
df["ST_NUM"].fillna(x, inplace = True)
清洗重复数据
判断是不是重复数据
duplicated()
person = {
"name": ['Google', 'Runoob', 'Runoob', 'Taobao'],
"age": [50, 40, 40, 23]
}
df = pd.DataFrame(person)
print(df.duplicated())
"name": ['Google', 'Runoob', 'Runoob', 'Taobao'],
"age": [50, 40, 40, 23]
}
df = pd.DataFrame(person)
print(df.duplicated())
0 False
1 False
2 True
3 False
dtype: bool
1 False
2 True
3 False
dtype: bool
删除重复数据
df.drop_duplicates(inplace = False)
persons = {
"name": ['Google', 'Runoob', 'Runoob', 'Taobao'],
"age": [50, 40, 40, 23]
}
df = pd.DataFrame(persons)
df.drop_duplicates(inplace = True)
print(df)
"name": ['Google', 'Runoob', 'Runoob', 'Taobao'],
"age": [50, 40, 40, 23]
}
df = pd.DataFrame(persons)
df.drop_duplicates(inplace = True)
print(df)
name age
0 Google 50
1 Runoob 40
3 Taobao 23
0 Google 50
1 Runoob 40
3 Taobao 23
替代数据
replace()
格式
df.replace(to_replace=None, value=None, inplace=False, limit=None, regex=False, method='pad')
解释
参数
to_replace
被替换的值
value
替换后的值
inplace
是否要改变原数据,False是不改变,True是改变,默认是False
limit
控制填充次数
regex
是否使用正则,False是不使用,True是使用,默认是False
method
填充方式,pad,ffill,bfill分别是向前、向前、向后填充
实例
map()
格式
Series.map(arg, na_action=None)
参数
arg
函数
实例
rename()
格式
df.rename(mapper=None, index=None, columns=None,
axis=None, copy=True, inplace=False, level=None, errors=‘ignore’)
axis=None, copy=True, inplace=False, level=None, errors=‘ignore’)
参数
mapper
传入字典或者函数
改变索引
columns
传入字典或者函数
改变列名
实例
数据聚合
(groupby())
(groupby())
解释
从几个数据中生成一个数
格式
df.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, **kwargs)
原理
使用步骤
首先通过groupby得到DataFrameGroupBy对象, 比如data.groupby('race')
然后选择需要研究的列, 比如['age'], 这样我们就得到了一个SeriesGroupby, 它代表每一个组都有一个Series
对SeriesGroupby进行操作, 比如.mean(), 相当于对每个组的Series求均值
如果不选列, 那么第三步的操作会遍历所有列, pandas会对能成功操作的列进行操作, 最后返回的一个由操作成功的列组成的DataFrame
整理列名
groupByedDf.reset_index()
不整理
整理
实例
高级操作
apply
格式
df.apply(func, axis=0, raw=False, result_type=None, args=(), **kwargs)
实际应用
对某一列的每个行数值应用某个函数
df['column_name'].apply(function)
对每一行应用某个函数
df.apply(function, axis=1)
用旧的列生成新的列
df['new_column_name'] = df['column_name'].apply(function)
参数解析
axis
重排索引
参考资料
pandas根据index操作与重新排列
reset_index
格式
df.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill='')
基本介绍
用于将dataframe的index重置为0-N(行数),如果不要原来的index记得drop=True
类型转换
参考资料
pandas 数据类型转换
astype()
格式
df['column_name'].astype(dtype, copy=True, errors='raise')
说明
dtype得写类似成'int16'
遍历每一行
参考资料
How To Loop Through Pandas Rows? or How To Iterate Over Pandas Rows?
df.iterrows()
实例
for index, row in df.iterrows():
do something
do something
实例
统计Dataframe不同的行数
df.value_counts().shape[0]
选择某个范围的行
data.iloc[(data.loc[:,'Elevation']>= a) & (data.loc[:,'Elevation'] <= b)]
0 条评论
下一页