pandas 从入门到放弃

  • 目录
  • 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()
    1. sort与rank
    1. 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
    如果文件只包含一列,则返回一个Series

  • na_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数据

pandas 从入门到放弃_第1张图片
image.png

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
pandas 从入门到放弃_第2张图片
image.png

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)
pandas 从入门到放弃_第3张图片
image.png

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

pandas 从入门到放弃_第4张图片
image.png

8.1 index的方法和属性

pandas 从入门到放弃_第5张图片
image.png

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

参数:

pandas 从入门到放弃_第6张图片
image.png

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参数

pandas 从入门到放弃_第7张图片
image.png

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进行数据分析》

你可能感兴趣的:(pandas 从入门到放弃)