Pandas
2021-10-28 15:04:57 4 举报
AI智能生成
Pandas知识脉络,请收藏,持续更新
作者其他创作
大纲/内容
引入
参考资料
Pandas菜鸟教程
Pandas官方文档
安装
普通环境
隔离环境
conda install pandas
导入
import pandas as pd
一维数据结构<br>Series
格式
pd.Series( data, index, dtype, name, copy)
参数说明
name
设置名称
index
数据索引标签,如果不指定,默认从 0 开始
a = ["Google", "Runoob", "Wiki"]<br>myvar = pd.Series(a, index = ["x", "y", "z"])<br>print(myvar["y"])<br>
使用列表创建
a = [1, 2, 3]<br>myvar = pd.Series(a)
使用字典创建
sites = {1: "Google", 2: "Runoob", 3: "Wiki"}<br>myvar = pd.Series(sites, index = [1, 2])<br>
字典的 key 变成了索引值。<br>如果我们只需要字典中的一部分数据,只需要指定需要数据的索引即可<br>
转换成list
s.tolist()
二维数据结构<br>DataFrame
特点
每列可以是不同的值类型, 既有行索引也有列索引
格式
pd.DataFrame( data, index, columns, dtype, copy)
参数说明
index
索引值,或者可以称为行标签
columns
列标签,默认为 RangeIndex (0, 1, 2, …, n)
从列表创建
data = [['Google',10],['Runoob',12],['Wiki',13]]<br>df = pd.DataFrame(data,columns=['Site','Age'],dtype=float)
从字典创建
data = {'Site':['Google', 'Runoob', 'Wiki'], 'Age':[10, 12, 13]}<br>df = pd.DataFrame(data)
字典不等长,直接转DataFrame会报错
如果字典只有一个值,那么要传递index参数,说明行索引是什么
pd.DataFrame(dummy_most_frequent_train['weighted avg'], <br>index=[0])<br>
创建空PD
参考资料
Pandas创建一个空DataFrame,并逐行插入数据
#创建一个空的Dataframe<br>result =pd.DataFrame(columns=('idx','degree','weight','diameter'))<br>#将计算结果逐行插入result,注意变量要用[]括起来,同时ignore_index=True,否则会报错,<br># ValueError: If using all scalar values, you must pass an index<br>for i in idx:<br> degree=<br> weight=<br> diameter=<br> 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', ...)<br>
参数
header
对无表头的数据,需设置header=None,否则第一行数据被作为表头<br>对无表头的数据,设置header=None,表头会默认设置为[0,1,2,3,...]<br>对有表头的数据,设置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<br>from sqlalchemy import create_engine<br>engine = create_engine('sqlite:///cba_log_rv.sqlite')<br>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']]
使用条件表达式<br>选择特定的行
格式
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, <br>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, <br>kind='quicksort', na_position='last', ignore_index=False, key=None)
s.sort_values(axis=0, ascending=True, inplace=False, <br>kind='quicksort', na_position='last', ignore_index=False, key=None)
解释
参数
by
Series的sort_values没有这个参数
ascending
Series
默认为True升序排列,为Flase降序排序<br>
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<br>ts = pd.Timestamp('2017-01-01 09:10:11')<br>ts + DateOffset(months=3)<br>
获取当前时间
数据信息
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, <br> 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, <br> left_index=False, right_index=False, sort=True, <br> suffixes=('_x', '_y'), copy=True, indicator=False)
解释
最常用,主要用于基于列的横向合并(合并列)
参数解析
left和right
两个不同的DataFrame
how
连接方式,有inner、left、right、outer,默认为inner
on
指的是用于连接的列索引名称,必须存在于左右两个DataFrame中,<br>如果没有指定且其他参数也没有指定,则以两个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()
格式
<b><font color="#1976d2">df</font></b>.join(other, on=None, how='left', lsuffix='', rsuffix='',sort=False)
解释
最简单,主要用于<font color="#1976d2">基于索引</font>的横向合并(<font color="#1976d2">不会增加新行</font>)
参数
how
连接方式,有inner、left、right、outer,默认为inner
on
指的是用于连接的列索引名称,必须存在于左右两个DataFrame中,<br>如果没有指定且其他参数也没有指定,则以两个DataFrame列名交集作为连接键;
sort
默认为True,将合并的数据进行排序,设置为False可以提高性能
lsuffix
字符串值组成的元组,用于指定当左右DataFrame存在相同列名时在列名后面附加的后缀名称
rsuffix
字符串值组成的元组,用于指定当左右DataFrame存在相同列名时在列名后面附加的后缀名称
实例
df1.join(df2)
combine_first()
append()
格式
<b><font color="#1976d2">df</font></b>.append(other, ignore_index=False, verify_integrity=False, sort=False)
解释
主要用于纵向追加,增加一行
实例
增加一列
参考资料
pandas新增一列作为id,或者新增有默认值的一列
nlist = range(1,n)<br>data['id'] = nlist<br> <br>data['label'] = 0
数据变换
转置
df.T
概述
行列变换(Pivoting)
stack()
格式
df.stack(level=-1, dropna=True)<br>
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', <br> 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'篮板'],<br> 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()<br>df["ST_NUM"].fillna(x, inplace = True)
使用中位数替换
x = df["ST_NUM"].median()<br>df["ST_NUM"].fillna(x, inplace = True)
使用众数替换
x = df["ST_NUM"].mode()<br>df["ST_NUM"].fillna(x, inplace = True)
清洗重复数据
判断是不是重复数据
duplicated()
person = {<br> "name": ['Google', 'Runoob', 'Runoob', 'Taobao'],<br> "age": [50, 40, 40, 23] <br>}<br>df = pd.DataFrame(person)<br><br>print(df.duplicated())
0 False<br>1 False<br>2 True<br>3 False<br>dtype: bool<br>
删除重复数据
df.drop_duplicates(inplace = False)
persons = {<br> "name": ['Google', 'Runoob', 'Runoob', 'Taobao'],<br> "age": [50, 40, 40, 23] <br>}<br><br>df = pd.DataFrame(persons)<br><br>df.drop_duplicates(inplace = True)<br>print(df)
name age<br>0 Google 50<br>1 Runoob 40<br>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, <br> axis=None, copy=True, inplace=False, level=None, errors=‘ignore’)<br>
参数
mapper
传入字典或者函数
改变索引
columns
传入字典或者函数
改变列名
实例
数据聚合<br>(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')<br>
说明
dtype得写类似成'int16'
遍历每一行
参考资料
How To Loop Through Pandas Rows? or How To Iterate Over Pandas Rows?<br>
df.iterrows()
实例
for index, row in df.iterrows():<br> do something
实例
统计Dataframe不同的行数
df.value_counts().shape[0]
选择某个范围的行
data.iloc[(data.loc[:,'Elevation']>= a) & (data.loc[:,'Elevation'] <= b)]
0 条评论
下一页