- 目录
- 1.创建对象
- 2.查看数据
- 3.写入数据(read_csv)
- 4.写出/导出数据(to_csv)
- 5.读取行/列
- 6.添加新的值/修改已有的值 (append) 删除 drop
- 7.广播broadcasting
- 8.索引index
- 9.apply()函数 与agg()函数
- 10.groupby() 函数
- 11.stack 函数
- 12.pivot()
- 13.sample() 与resample()
- sort与rank
- rolling()
- pandas视觉化:
- 1.plot()
1.创建对象
1.1 series:
Creating a Series by passing a list of values, letting pandas create a default integer index
Series 是一个值的序列,它只有一个列,以及索引。下面的例子中,就用默认的整数索引
s = pd.Series([1,3,5,np.nan,6,8])
0 1.0
1 3.0
2 5.0
3 NaN
4 6.0
5 8.0
dtype: float64
1.2 dataframe
DataFrame 是有多个列的数据表,每个列拥有一个 label,当然,DataFrame 也有索引
dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
A B C D
2013-01-01 -0.791274 -1.036452 -0.442802 -0.348499
2013-01-02 0.301447 -1.294061 0.527779 -0.989473
2013-01-03 1.194980 1.032717 -0.747851 0.483149
2013-01-04 1.080179 0.760932 -0.660007 0.901296
2013-01-05 0.750439 -1.494272 1.108947 0.057424
2013-01-06 0.431982 -0.829019 1.166722 0.216905
1.3 通过字典dict转变成表格
web_stats = {'Day':[1,2,3,4,5,6],
'Visitors':[43,34,65,56,29,76],
'Bounce Rate':[65,67,78,65,45,52]}
df = pd.DataFrame(web_stats)
df
Day Visitors Bounce Rate
0 1 43 65
1 2 34 67
2 3 65 78
3 4 56 65
4 5 29 45
5 6 76 52
其实可以把dataframe 理解为由series组成的
1.3.1 通过字典和zip创建表格(2)
cities = ['austin','dallas','austin','dallas']
signups = [7,12,3,5]
visitors =[139,237,326,456]
weekdays = ['sun','sun','mon','mon']
list_labels = ['city','signups','visitors','weekday']
list_cols = [cities,signups,visitors,weekdays]
zipped =list(zip(list_labels,list_cols))
data = dict(zipped)
users = pd.DataFrame(data)
users
city signups visitors weekday
0 austin 7 139 sun
1 dallas 12 237 sun
2 austin 3 326 mon
3 dallas 5 456 mon
1.3.2 通过嵌套字典创建
pop = {'Nevada':{2001:2.4,2002:2.9},'Ohio':{2000:1.5,2001:1.7,2002:3.6}}
df= pd.DataFrame(pop)
df
Nevada Ohio
2000 NaN 1.5
2001 2.4 1.7
2002 2.9 3.6
外层字典的键作为列,内层键作为行索引
2.查看数据
2.1 df.head()
查看表格开头
2.2 df.tail()
查看表格结尾
2.3 df.describe()
查看表格的数值描述
2.4 df.index()
DataFrame 内部用 numpy 格式存储数据。你也可以单独查看 index 和 columns
2.5 df.columns()
看header的列名,这个返回的是index
food.columns[104] #直接查看某一列的名称
可以通过 tolist(), 或者 list(array) 转换为list
df.columns.tolist()
df.columns.values #返回 array
2.6 df.values()
看dataframe中的值
2.7 df.info()
会给数据的整体情况:RangeIndex;Columns;dtypes;memory usage
question:the number of columns?
df.info()
2.8 df.shape
number of observations in the dataset
shape 查看表格不用加() 参数
df.shape
查看表头的名称
df.shape[1]
2.9 df.dtypes
查看数据类型
df.dtypes #注意不要加括号,不需要参数
series.dtype #查看series的数据类型
food.dtypes['-glucose_100g'] #查看某一列的数据类型
ps:pandas支持的数据类型:
1. float
2. int
3. bool
4. datetime64[ns]
5. datetime64[ns, tz]
6. timedelta[ns]
7. category
8. object
默认的数据类型是int64,float64.
2.10 df.quantile()
求分位数,IQR
q=[0.25,0.75]
iris.quantile(q)
3.读取数据
3.1 pd.read_csv()
pd.read_csv(filepath_or_buffer, sep=',', delimiter=None, header='infer', names=None, index_col=None,
usecols=None, squeeze=False, prefix=None, mangle_dupe_cols=True, dtype=None, engine=None,
converters=None, true_values=None, false_values=None, skipinitialspace=False, skiprows=None,
nrows=None, na_values=None, keep_default_na=True, na_filter=True, verbose=False, skip_blank_lines=True,
parse_dates=False, infer_datetime_format=False, keep_date_col=False, date_parser=None, dayfirst=False, iterator=False,
chunksize=None, compression='infer', thousands=None, decimal=b'.', lineterminator=None, quotechar='"', quoting=0,
escapechar=None, comment=None, encoding=None, dialect=None, tupleize_cols=False, error_bad_lines=True,
warn_bad_lines=True, skipfooter=0, skip_footer=0, doublequote=True, delim_whitespace=False,
as_recarray=False, compact_ints=False, use_unsigned=False, low_memory=True, buffer_lines=None,
memory_map=False, float_precision=None)
常用参数:
默认分隔符是逗号 sep :str, default ‘,’ 指定分隔符。如果不指定参数,则会尝试使用逗号分隔。csv文件一般为逗号分隔符。
header :int or list of ints, default ‘infer’ 指定行数用来作为列名,数据开始行数。如果文件中没有列名,则默认为0,否则设置为None。对于数据读取有表头和没表头的情况很实用
names : array-like, default None 用于结果的列名列表,对各列重命名,即添加表头。
如数据有表头,但想用新的表头,可以设置header=0,names=['a','b']实现表头定制。index_col : int or sequence or False, default None 用作行索引的列编号或者列名,如果给定一个序列则有多个行索引。
可使用index_col=[0,1]来指定文件中的第1和2列为索引列。usecols : array-like, default None 返回一个数据子集,即选取某几列,不读取整个文件的内容,有助于加快速度和降低内存。
usecols=[1,2]或usercols=['a','b']squeeze : boolean, default False
如果文件只包含一列,则返回一个Seriesna_values : scalar, str, list-like, or dict, default None 一组用于替换NA/NaN的值。如果传参,需要制定特定列的空值。
默认为‘1.#IND’, ‘1.#QNAN’, ‘N/A’, ‘NA’, ‘NULL’, ‘NaN’, ‘nan’`.
index_col 可以选择两个索引列,也就是将多个列做成一个层次化索引
3.1.1 pandas读取tsv
TSV文件和CSV的文件的区别是:前者使用\t作为分隔符,后者使用,作为分隔符。
df=pd.read_csv('test.tsv', sep='\t', header=0, index_col='id')
3.2 pd.read_excel()
pd.read_excel(io, sheetname=0,header=0,skiprows=None,
index_col=None,names=None, arse_cols=None,
date_parser=None,na_values=None,thousands=None,
convert_float=True,has_index_names=None,
converters=None,dtype=None,
true_values=None,false_values=None,engine=None,
squeeze=False,**kwds)
用来读xlsx文件
3.3 pd.read_table()
适合用来读取txt文本,分隔符为\t
3.4
4.写出数据/导出数据
4.1 df.to_csv
写入到 csv 文件
DataFrame.to_csv(path_or_buf=None, sep=', ', na_rep='', float_format=None, columns=None, header=True, index=True,
index_label=None, mode='w', encoding=None, compression=None, quoting=None, quotechar='"',
line_terminator='\n', chunksize=None, tupleize_cols=None, date_format=None, doublequote=True,
escapechar=None, decimal='.')
参数:
path_or_buf : 文件路径,如果没有指定则将会直接返回字符串的 json
sep : 输出文件的字段分隔符,默认为 “,”
na_rep : 用于替换空数据的字符串,默认为''
float_format : 设置浮点数的格式(几位小数点)
columns : 要写的列
header : 是否保存列名,默认为 True ,保存
index : 是否保存索引,默认为 True ,保存
index_label : 索引的列标签名
4.2 df.to_json
写入到 json 文件
DataFrame.to_json(path_or_buf=None, orient=None, date_format=None, double_precision=10, force_ascii=True,
date_unit='ms', default_handler=None, lines=False, compression=None, index=True)
参数:
path_or_buf : 文件路径,如果没有指定则将会直接返回字符串的 json。
4.3 df.to_html
写入到 html 文件
DataFrame.to_html(buf=None, columns=None, col_space=None, header=True, index=True, na_rep='NaN', formatters=None,
float_format=None, sparsify=None, index_names=True, justify=None, bold_rows=True, classes=None,
escape=True, max_rows=None, max_cols=None, show_dimensions=False, notebook=False, decimal='.',
border=None, table_id=None)
df.to_html 生成的是一个 html 格式的 table 表,我们可以在前后加入其他标签,丰富页面。ps:如果有中文字符,需要在 head 中设置编码格式。
4.4 df.to_excel
写入到 excel 文件
DataFrame.to_excel(excel_writer, sheet_name='Sheet1', na_rep='', float_format=None, columns=None,
header=True, index=True, index_label=None, startrow=0, startcol=0, engine=None,
merge_cells=True, encoding=None, inf_rep='inf', verbose=True, freeze_panes=None)
5.读取行/列: 切片
5. 1 直接用[ ]读取
df['A']
或者
df[0:3]
5.2 通过df.loc()读取
.loc[],中括号里面是先行后列,以逗号分割,行和列分别是行标签和列标签
df.loc['2013-01-01','A']
总结:先行后列,多行或者多列就用 : 取值, 关键字用标签表示
如果没有特殊需求,强烈建议使用loc而尽量少使用[],因为loc在对DataFrame进行重新赋值操作时会避免chained indexing问题,使用[]时编译器很可能会给出SettingWithCopy的警告。
5.3 通过df.iloc()读取
.iloc[]与loc一样,中括号里面也是先行后列,行列标签用逗号分割,与loc不同的之处是,.iloc 是根据行数与列数来索引的
df.iloc[0,0]
与df.loc()同样结果
总结: 同样先行后列,多行多列用: , 关键字用数字表示!!!
注意python从0开始!!!
5.4 通过对布尔值
df[df.A>0]
A B C D
2013-01-01 0.827999 1.153047 0.464674 0.778462
2013-01-04 0.426128 -1.253330 -0.473582 -0.112445
5.5 通过df.at() 读取
at的使用方法与loc类似,但是比loc有更快的访问数据的速度,而且只能访问单个元素,不能访问多个元素。
cities = ['austin','dallas','austin','dallas']
signups = [7,12,3,5]
visitors =[139,237,326,456]
weekdays = ['sun','sun','mon','mon']
list_labels = ['city','signups','visitors','weekday']
list_cols = [cities,signups,visitors,weekdays]
zipped =list(zip(list_labels,list_cols))
data = dict(zipped)
users = pd.DataFrame(data)
users.at[1,'city']
ps: 行取值是index, 当index不是int数字时候,会报错? 暂时不知道怎么解决
选列是只能是列名,不能是position
5.6 通过df.iat() 读取
选列是只能是position (数字),不能是列名
5.7 通过[[ ]]读取column数据
这样避免读出的是series数据,而是dataframe数据
6.为dataframe添加新的值/修改某个值
6.1 通过[ ] 修改一列的值
df['A'] = 0
qusetion: 通过 [ ]只能修改一行/多行的值,一列或者多列的值,不能 [ ]行,列的值???
6.2 按照index对应添加新的列
s1 = pd.Series([1,2,3,4,5,6], index=pd.date_range('20130102', periods=6))
df['F'] = s1
df
6.3 通过label 修改某个值
df.at[dates[0],'A'] = 0
修改了第一列 A column的值
6.4 通过下标修改值 (iat)
df.iat[0,1] = 1
df
6.5通过loc 修改
df.loc[:,'D'] = np.arange(6)
df
6.6 通过布尔值 修改
df[df > 0] = 1
df
6.7 通过append()
向 DataFrame 增加新的数据行
df = pd.DataFrame(np.random.randn(8, 4), columns=['A','B','C','D'])
df
s = df.iloc[3]
df.append(s, ignore_index=True)
6.8 删除drop
df.drop(['index1','index2']) #可删除多个index
df.drop(['column1','column2'],axis=1) #删除column axis=1 就是列的值
7. 广播 broadcasting
7.1 dataframe之间的运算
import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.arange(9.).reshape((3,3)),columns=list('bcd'),index=['ohio','texas','colorado'])
df2 = pd.DataFrame(np.arange(12.).reshape((4,3)),columns=list('bde'),index=['utah','ohio','texas','orrgon'])
df1 + df2
b c d e
coloradoNaN NaN NaN NaN
ohio 3.0 NaN 6.0 NaN
orrgon NaN NaN NaN NaN
texas 9.0 NaN 12.0 NaN
utah NaN NaN NaN NaN
没有的值就会用na补充
或者可以用 .add( fill_value=)补充
df1.add(df2,fill_value=0)
.add() 加法
.sub() 减法
.div()除法
.mul()乘法
7.2 dataframe和series之间的运算
之后补充
8.index索引
pandas的索引对象用来保存坐标轴标签和其它元数据(如坐标轴名或名称)。构建一个Series或DataFrame时任何数组或其它序列标签在内部转化为索引
索引对象是不可变的,因此不能由用户改变
我的理解是,不可以用切片的方式更改,可以用reindex
8.1 index的方法和属性
8.2 reindex用法
创建一个适应新索引的新对象
8.2.1 reindex 和series
obj = pd.Series([4.5,7.2,-5.3,3.6],index=['d','b','a','c'])
obj
d 4.5
b 7.2
a -5.3
c 3.6
dtype: float64
obj2 = obj.reindex(['a','b','c','d','e'])
obj2
a -5.3
b 7.2
c 3.6
d 4.5
e NaN
dtype: float64
obj.reindex(['a','b','c','d','e'],fill_value=0)
a -5.3
b 7.2
c 3.6
d 4.5
e 0.0
dtype: float64
参数:
8.2.2 reindex 和 dataframe
在dataframe中,reindex可以修改行/索引,列,或者两个都修改。 如果仅传入一个序列,则会重新索引行
frame = pd.DataFrame(np.arange(9).reshape((3,3)),index = ['a','c','d'],columns = ['Ohio','Texas','California'])
frame
Ohio Texas California
a 0 1 2
c 3 4 5
d 6 7 8
frame2 = frame.reindex(['a','b','c','d']) #没有的就用NaN代替
frame2
Ohio Texas California
a 0.0 1.0 2.0
b NaN NaN NaN
c 3.0 4.0 5.0
d 6.0 7.0 8.0
states = ['Texas','Utah','California'] #使用关键字即可重新索引列
frame.reindex(columns = states)
Texas Utah California
a 1 NaN 2
c 4 NaN 5
d 7 NaN 8
frame.reindex(index=['a','b','c','d'],columns=states).ffill()
California Texas Utah
a 2.0 1.0 NaN
b 2.0 1.0 NaN
c 5.0 4.0 NaN
d 8.0 7.0 NaN
按照书上的代码会报错,把method=‘ffill'删除,在reindex()后面ffill()
8.2.3 reindex参数
9.apply函数 与 agg() 函数
9.1 apply
df.apply(func, axis=0, broadcast=False, raw=False, reduce=None, args=(), **kwds)
axis=0 列
axis = 1 行
apply函数可以对DataFrame对象进行操作,既可以作用于一行或者一列的元素,也可以作用于单个元素。
func 是要在之前def好的 或者其他已有的func
9.2 agg()
agg()
10.groupby()函数
分组函数
在数据分析文章中有详细介绍
11.stack()函数
占坑
用到再学
12.pivot()
占坑
用到再学
13.sample()与resample()
13.1 sample()
DataFrame.sample(n=None, frac=None, replace=False, weights=None, random_state=None, axis=None)
参数:
n是要抽取的行数。(例如n=20000时,抽取其中的2W行)
frac是抽取的比列。(有一些时候,我们并对具体抽取的行数不关系,我们想抽取其中的百分比,这个时候就可以选择使用frac,例如frac=0.8,就是抽取其中80%)
replace:是否为有放回抽样,取replace=True时为有放回抽样。
weights这个是每个样本的权重,具体可以看官方文档说明。
random_state:
axis是选择抽取数据的行还是列。axis=0的时是抽取行,axis=1时是抽取列(也就是说axis=1时,在列中随机抽取n列,在axis=0时,在行中随机抽取n行)
13.2 resample()
重新采样,是对原样本重新处理的一个方法,是一个对常规时间序列数据重新采样和频率转换的便捷的方法。
DataFrame.resample(rule, how=None, axis=0, fill_method=None, closed=None, label=None, convention='start',kind
=None, loffset=None, limit=None, base=0)
参数:freq 表示重采样频率,例如‘M’、‘5min’,Second(15)
how=’mean’ 用于产生聚合值的函数名或数组函数,例如‘mean’、‘ohlc’、np.max等,默认是‘mean’,其他常用的值由:‘first’、‘last’、‘median’、‘max’、‘min’
axis=0 默认是纵轴,横轴设置axis=1
fill_method = None 升采样时如何插值,比如‘ffill’、‘bfill’等
closed = ‘right’ 在降采样时,各时间段的哪一段是闭合的,‘right’或‘left’,默认‘right’
label= ‘right’ 在降采样时,如何设置聚合值的标签,例如,9:30-9:35会被标记成9:30还是9:35,默认9:35
14.sort与rank
《 》书中138页
15. df.rolling()
为了提升数据的准确性,将某个点的取值扩大到包含这个点的一段区间,用区间来进行判断,这个区间就是窗口。移动窗口就是窗口向一端滑行,默认是从右往左,每次滑行并不是区间整块的滑行,而是一个单位一个单位的滑行。
DataFrame.rolling(window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None)
window: 也可以省略不写。表示时间窗的大小,注意有两种形式(int or offset)。如果使用int,则数值表示计算统计量的观测值的数量即向前几个数据。如果是offset类型,表示时间窗的大小。offset详解
min_periods:每个窗口最少包含的观测值数量,小于这个值的窗口结果为NA。值可以是int,默认None。offset情况下,默认为1。
center: 把窗口的标签设置为居中。布尔型,默认False,居右
win_type: 窗口的类型。截取窗的各种函数。字符串类型,默认为None。各种类型
on: 可选参数。对于dataframe而言,指定要计算滚动窗口的列。值为列名。
axis: int、字符串,默认为0,即对列进行计算
closed:定义区间的开闭,支持int类型的window。对于offset类型默认是左开右闭的即默认为right。可以根据情况指定为left both等。
pandas中的可视化
1. df.plot()
DataFrame.plot(x=None, y=None, kind='line',
ax=None, subplots=False, sharex=None,
sharey=False, layout=None, figsize=None,
use_index=True, title=None, grid=None, legend=True,
style=None, logx=False, logy=False, loglog=False,
xticks=None, yticks=None, xlim=None, ylim=None,
rot=None, fontsize=None, colormap=None, table=False,
yerr=None, xerr=None, secondary_y=False,
sort_columns=False, **kwds)
参数:
*ax8:matplotlib轴对象,默认为None。
subplots:默认为False,如果为True则为每列数据制作单独的子图。
sharex 、sharey : 布尔值,共享x,y轴。
layout : 元组(行,列)用于子图的布局。
figsize:元组(宽度,高度),以英寸为单位。
use_index:布尔值,默认为True,使用index作为x轴的坐标。
title:字符串或列表,用于图的标题。如果传入一个字符串,则在图的顶部打印字符串。如果传入的是一个列表且子图为True,则在相应子图上方打印列表中的每个项目。
grid:布尔值,默认为None,是否显示网格线。
kind: ‘line’ : line plot (default); ‘bar’ : vertical bar plot; ‘barh’ : horizontal bar plot; ‘hist’ : histogram
‘box’ : boxplot; ‘kde’ : Kernel Density Estimation plot;‘density’ : same as ‘kde’; ‘area’ : area plot
‘pie’ : pie plot; ‘scatter’ : scatter plot; ‘hexbin’ : hexbin plot
reference:
https://blog.csdn.net/Vinsuan1993/article/details/79972319
https://blog.csdn.net/tz_zs/article/details/81137998
https://ericfu.me/10-minutes-to-pandas/
https://pda.readthedocs.io/en/latest/chp5.html
https://blog.csdn.net/qq1483661204/article/details/77587881
https://www.jianshu.com/p/199a653e9668
https://blog.csdn.net/qq_22238533/article/details/71080942
https://blog.csdn.net/tz_zs/article/details/81350409
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.plot.html
https://blog.csdn.net/zgljl2012/article/details/79109525
https://blog.csdn.net/TH_NUM/article/details/80296254
https://blog.csdn.net/claroja/article/details/72622375
https://blog.csdn.net/wangshuang1631/article/details/52314944
https://blog.csdn.net/qq_36330643/article/details/76173281
https://blog.csdn.net/maymay_/article/details/80241627
《利用python进行数据分析》