基本操作
索引
a.iloc[0,2]=a.iloc[0][2] (右边的更常用和标准,因为多层索引的问题)取第一行第三列的数
取列用a[“b”]或者a.b
切片
- 显式索引(终点也包括)
a.loc[1]
a.loc[1:2]
隐式索引
a.iloc[1]
a.iloc[1:3]
过滤
迭代
- Series
for i in a.iteritems():
print(i)
#index和values都会打印出来
- DataFrame
for i,j in b.iteritems():
print(i)
print(j)
#先按列再按行迭代
for i,j in b.iterrows():
print(i)
print(j)
#按行再按列进行迭代
排序
- Series
a1.sort_values()
a1.sort_index() - DataFrame
a2.sort_values(by='column2')[["column1","column2"]]
a2.sort_index(axis =1)
Pandas的运算
自定义索引的存在,使得索引对齐非常重要
和常数运算
同种类型之间的运算
找不到索引匹配的值定为NaN
- Series之间
a + b
a.add(b,fill_value=0) - DataFrame之间
d+c - Series和DataFrame之间
广播机制(默认纵向复制)
a+a[“b”]会产生全NaN(因为默认纵向复制),此时用a.add(a[“b”],axis=1)
Pandas的多级索引
- 创建
a1 = pd.Series(range(0,4),index = [[m1,m1,m2,m2][L1,L2,L1,L2]])
#DataFrame与Series类似
#a1.index会显示MultiIndex对象(包含levels和labels)
a.index.name = ["class","gender"] #给多层索引增加名字
#索引的单独创建
in1 = pd.MultiIndex.from_arrays([["class1","class2"],["m1""m2"]])
in1 = pd.MultiIndex.from_tuples([["class1","m1"],["class2","m2"]])
df1 =pd.Series([100,200],index=in1)
- 结构转换
a.unstack() #Series转换为dataframe,默认把最里面转换为列标
a.unstack(level=0)#强制转换最外层
a.unstack().stack()#转换回去
a.reset_index()#所有多层索引彻底转换为横向
a.set_index("class","gender")#变回来(设定索引)
- 切片
a["class1","man"]#只能从外往里层索引
a["class1":"class2"]
a["class1","class2"]
df1["class1","man"]["x"]
统计函数和groupby
统计函数
- count,sum,prod,min,max,first,last,mean,median,std,var,mad(均值绝对偏差)
默认对列进行统计(axis=0),可显式制定(axis=1) - describe()标准集成统计函数,agg()自定义集成哪些统计函数
最有用的数据分析函数groupby
- 对数据框a有
key,data___split___appy___combine
groupby理解为将a列作为一个新的索引,数据框成为一个二层索引的数据框
a.groupby('a')#以"a"列进行groupby(相同元素的在一起)
#groupby迭代(常用)
for i in a.groupby("a"):
print(i[1])
print()
a.groupby("a","b")
a.groupby("a").get_group("j")#切片
-
groupby之后仍然继承dataframe的特性,可使用统计函数等,但是按照部分进行统计
-
过滤
def g1(x):
return x["b"].sum()>3
a1.filter(g1)#找出满足条件的组
- transform和apply
apply更好用
a1.transform(lambda: x:x.mean())#保持原有索引结构,同时强制保持原有除去groupby列的剩余列。
a1.apply(lambda: x:x.mean())#对整个数据框,不会除去groupby列,还可切片,很灵活,但是效率慢。要主要apply用在Series还是DataFrame上
- 自定义分组
g1 = [0,0,0,1,1,1]
a.groupby(g1)
g1 = a["b"]%2
a.groupby(g1)
案例:在线交易行为统计分析(二)
时间数据分析
- 时间戳——timestamp
- 时间间隔——timedelta
-
定义
- 时间戳 pd.to_datetime(“20140404”)
- 时间间隔 pd.to_timedelta(15,“D”)
- 时间戳序列(DatetimeIndex) pd.date_range(“1/1/2011”,periods=10,freq=“5m”)
-
重采样(resample)
- 向上采样(时间尺度更细)
- 向下采样(时间尺度变宽)
#需要索引为时间序列
f1.resample("2D",closed="right").sum()#运行索引重复
f1.asfreq("10H")#asfreq并不做分组,只是单纯的采样,会抛弃样本以外的结果。且不允许索引重复
- 分组采样
f1.index.week
#Group函数专门用来生成时间分组序列的函数,默认情况下是对数据框的键进行处理
#相比resample,Grouper函数功能更强大
f1.groupby(["a",pd.Grouper(freq="5D")])