pandas基础

1.文件的读取与写入

文件读取

读取csv,excel,txt文件

pd.read_csv('my_csv.csv')

pd.read_table('my_txt.txt')

pd.read_excel('my_excel.excel')

参数

headers=None,表示第一行不作为列名
index_col,表示把某一列或几列作为索引
usecols,表示需要读哪几列
nrows,表示读取的数据行数
parse_dates,表示需要转化为时间的列

在读取 txt 文件时,经常遇到分隔符非空格的情况, read_table 有一个分割参数 sep ,它使得用户可以自定义分割符号,进行 txt 数据的读取。例如,下面的读取的表以 |||| 为分割:

使用 sep ,同时需要指定引擎为 python

pd.read_table('data/my_table_special_sep.txt',
				  sep=' \|\|\|\| ', engine='python')

注:read_table中,seq使用的是正则表达式,对字符进行转义

数据写入

my_csv.to_csv('my_csv_saved.csv', index=False)
#to_csv可以保存为txt文件

my_excel.to_excel('data/my_excel_saved.xlsx', index=False)

2.基本数据结构

pandas中具有两种基本的数据存储结构,存储一维 values 的 Series和存储二维 values 的 DataFrame

Series

pd.Series(data = [100, 'a', {'dic1':5}],
          index = pd.Index(['id1', 20, 'third'], name='my_idx'),
	      dtype = 'object',
	      name = 'my_name')

获取属性

s.values
s.index
s.dtype
s.name
s.shape
#单个索引值
s['id1']

DataFrame

data = [[1, 'a', 1.2], [2, 'b', 2.2], [3, 'c', 3.2]]
df = pd.DataFrame(data = data,
				  index = ['row_%d'%i for i in range(3)],	           					 columns=['col_0', 'col_1', 'col_2'])

获取属性

df.values
df.index
df.dtype
df.name
df.shape
#单个索引值
df['col_0']

转置

df.T

3.常用函数

汇总函数

#head返回前n行,默认是5
df.head(n)

#tail返回后n行,默认是5
df.tail(n)

#info返回信息概况
df.info()

#describe返回数值列对应的统计信息
df.describe()

特征统计函数

sum, mean, median, var, std, max, min

#均值
df['特征名'].mean()

#最大值
df['特征名'].max()

quantile:分位数

count:缺失值个数

idxmax:最大值对应索引

df['特征名'].quantile(0.5)
df['特征名'].count()
df['特征名'].idmax()

注:以上函数的公共参数axis,默认为0逐列聚合,1为逐行聚合

唯一值函数

unique:唯一值组成的列表

nunique:唯一值个数

value_counts:唯一值及对应频数

df['特征名'].unique()
df['特征名'].nunique()
df['特征名'].value_counts()

观察多个列组合的唯一值,使用drop_duplicates,参数keep

默认值 first 表示每个组合保留第一次出现的所在行, last 表示保留最后一次出现的所在行, False 表示把所有重复组合所在的行剔除

df.drop_duplicates(['特征名', '特征名'])
df.drop_duplicates(['特征名', '特征名'],keep='last')

替换函数

replace函数:构造字典

df['gender'].replace({'Female':0, 'Male':1}).head()
df['Gender'].replace(['Female', 'Male'], [0, 1]).head()

逻辑替换

s.where(s<0, 100)

排序函数

#默认参数 ascending=True 为升序
df.sort_values('特征').head()

#多列排序
df.sort_values(['Weight','Height'],ascending=[True,False]).head()

#索引排序:字符串的排列顺序由字母顺序决定
df_demo.sort_index(level=['Grade','Name'],ascending= 		    									[True,False]).head()

apply方法

df.apply(my_mean)
def my_mean(x):
	res=x.mean()
	return res
df.apply(my_mean)

#axis控制行列输入
df.apply(lambda x:x.mean())

4.窗口对象

滑动窗口 rolling 、扩张窗口 expanding 以及指数加权窗口 ewm

滑窗对象

s = pd.Series([1,2,3,4,5])
roller = s.rolling(window = 3)

#聚合运算
roller.mean()
roller.sum()

#滑动协方差运算/滑动协方差运算
s2 = pd.Series([1,2,6,16,30])
roller.cov(s2)

roller.corr(s2)

roller.apply(lambda x:x.mean())

shift, diff, pct_change 是一组类滑窗函数,它们的公共参数为 periods=n ,默认为1,分别表示取向前第 n 个元素的值、与向前第 n 个元素做差(与 Numpy 中不同,后者表示 n 阶差分)、与向前第 n 个元素相比计算增长率。这里的 n 可以为负,表示反方向的类似操作。

In [104]: s = pd.Series([1,3,6,10,15])

In [105]: s.shift(2)
Out[105]: 
0    NaN
1    NaN
2    1.0
3    3.0
4    6.0
dtype: float64

In [106]: s.diff(3)
Out[106]: 
0     NaN
1     NaN
2     NaN
3     9.0
4    12.0
dtype: float64

In [107]: s.pct_change()
Out[107]: 
0         NaN
1    2.000000
2    1.000000
3    0.666667
4    0.500000
dtype: float64

In [108]: s.shift(-1)
Out[108]: 
0     3.0
1     6.0
2    10.0
3    15.0
4     NaN
dtype: float64

In [109]: s.diff(-2)
Out[109]: 
0   -5.0
1   -7.0
2   -9.0
3    NaN
4    NaN
dtype: float64

将其视作类滑窗函数的原因是,它们的功能可以用窗口大小为 n+1rolling 方法等价代替:

In [110]: s.rolling(3).apply(lambda x:list(x)[0]) # s.shift(2)
Out[110]: 
0    NaN
1    NaN
2    1.0
3    3.0
4    6.0
dtype: float64

In [111]: s.rolling(4).apply(lambda x:list(x)[-1]-list(x)[0]) # s.diff(3)
Out[111]: 
0     NaN
1     NaN
2     NaN
3     9.0
4    12.0
dtype: float64

In [112]: def my_pct(x):
   .....:     L = list(x)
   .....:     return L[-1]/L[0]-1
   .....: 

In [113]: s.rolling(2).apply(my_pct) # s.pct_change()
Out[113]: 
0         NaN
1    2.000000
2    1.000000
3    0.666667
4    0.500000
dtype: float64

练一练

rolling 对象的默认窗口方向都是向前的,某些情况下用户需要向后的窗口,例如对1,2,3设定向后窗口为2的 sum 操作,结果为3,5,NaN,此时应该如何实现向后的滑窗操作?

2. 扩张窗口

扩张窗口又称累计窗口,可以理解为一个动态长度的窗口,其窗口的大小就是从序列开始处到具体操作的对应位置,其使用的聚合函数会作用于这些逐步扩张的窗口上。具体地说,设序列为a1, a2, a3, a4,则其每个位置对应的窗口即[a1]、[a1, a2]、[a1, a2, a3]、[a1, a2, a3, a4]。

In [114]: s = pd.Series([1, 3, 6, 10])

In [115]: s.expanding().mean()
Out[115]: 
0    1.000000
1    2.000000
2    3.333333
3    5.000000
dtype: float64

参考

https://datawhalechina.github.io/joyful-pandas/build/html/

你可能感兴趣的:(pandas,python,大数据,数据分析,pandas)