pandas是一个方便易用的Python数据处理库,数据科学家们的利器之一哦。
本文简要介绍pandas的一些常用方法。
1 语法——创建DataFrames
import pandas as pd
Ex 1.1 由字典创建DataFrames
df = pd.DataFrame(
{"a":[4,5,6], #每一列的数据
"b":[7,8,9]},
index = [1,2,3]) #行索引
df
Ex 1.2 由数组创建DataFrames
df = pd.DataFrame(
[[4,7],
[5,8],
[6,9]],
index = [1,2,3],
columns = ['a','b'])
df
Ex 1.3 多重索引的DataFrames
df = pd.DataFrame(
{"a":[4,5,6],"b":[7,8,9]},
index = pd.MultiIndex.from_tuples(
[('d',1),('d',2),('e',2)]))
df
2 Reshaping Data ——改变数据集的布局
Ex 2.1 pd.melt
考虑一个DataFrame
, 某些列为ID变量id_vars
,其余列为测量的变量value_vars
; 测量变量列被逆透视为行,最终除了ID列只剩下两列variable
和 value
。这个函数起名为融化melt
,名副其实——将许多列消融至两列,胖胖表变成瘦瘦表的视觉效果。
[使用场景]:适合用于将高维特征转化为 Event Log(ID,FeatX,x)
df = pd.DataFrame(
{"a":[1,2,3],"b":[4,5,6],"c":[7,8,9]},
index = [1,2,3])
df
pd.melt(df,id_vars=['a'])
Ex 2.2 df.pivot
[使用场景]:与melt相反,pivot将行组织成紧凑的列,适合将Event log 转化为 高维特征矩阵。
考虑这么一个DataFrame
df = pd.DataFrame({'foo': ['one','one','one','two','two','two'],
'bar': ['A', 'B', 'C', 'A', 'B', 'C'],
'baz': [1, 2, 3, 4, 5, 6]})
对foo列进行bar透视,即将foo这一列变成新的行索引,bar这一列变成列索引,这样我们就可以清晰地看见foo列和bar列的关系
df.pivot(index = 'foo',columns = 'bar',values = 'baz')
Ex 2.3 pd.concat
向DataFrame中添加行或列
pd.concat([df,df])#注意数组
pd.concat([df,df],axis = 1)
Ex 2.4 df.unstack
对于一个多索引的DataFrame
来说,我们可以将某一个层级的索引“解”出来——变为列。
df.index.get_level_values(1)
new_df = df[['value']].unstack(level=-1).fillna(False) # level=-1选择最里面的索引层
new_df.columns = new_df.columns.get_level_values(1) # 取最里层列索引作为新的列
Ex 2.5 Else
- 排序 df.sort_values
- 设置索引 df.reset_index 将索引置为行号,原索引变成列
- 调整索引 df.reindex(index=new_index),向原来的索引中加入或者删除项
- 重命名列 df.rename
- 丢弃列 df.drop(axis=1)
df
df.sort_values('bar',ascending=False)
df.sort_index()
df.reset_index()
df.rename(columns = {"foo":"conan"})
df.drop(['foo'],axis =1)
3 Subset Observations ——行
- 头几行
- 尾几行
- 去重
- 逻辑准则
- 采样
- 按位置选择
- 按序选择(最大 最小)
df.head(2)
df.tail(2)
df.drop_duplicates()
df.sample(frac = 0.2)
df.sample(2)
df.iloc[2:3]#与python数组类似
df.nlargest(2,'baz')
df.nsmallest(2,'baz')
df[df.baz > 1]
4 Subset Variables——列
- 选择一列
- 选择多列
- 选择列名匹配给定正则表达式的列
- 按位置选列
Ex 4.1 比较 iloc loc ix
- loc 只能处理index的label
- iloc 只能处理index的位置,因此只接受整数
- ix 试图像loc一样通过label处理index,失败时就如同iloc
df.foo
0 one
1 one
2 one
3 two
4 two
5 two
Name: foo, dtype: object
df[['foo','bar']]
df.filter(regex='o$')
df.loc[:,'bar':'foo']
df.iloc[:,[0,1]]
df.loc[df['baz'] > 1, ['foo','bar']]
5 Summarize Data
- 统计unique值的出现频率 df.column_name.value_counts()
- 每一列的描述性统计 df.decribe
- 常用summary functions
- 处理各种pandas对象:DataFrame columns,Series,GroupBy,Expanding,Rolling
- 每个group得到单独的一个值
- 当应用到DataFrame时,返回Series
其中apply函数需要指定axis
* 0 or 'index': apply function to each column
* 1 or 'columns': apply function to each row
df.foo.value_counts()
two 3
one 3
Name: foo, dtype: int64
df.describe()
type(df.sum())
pandas.core.series.Series
df
image.png
def myfunc(row):
#print(row)
#print(type(row))
print(row.foo)
return"finished"
df.apply(myfunc,axis=1)#注意指定axis
one
one
one
two
two
two
0 finished
1 finished
2 finished
3 finished
4 finished
5 finished
dtype: object
6 缺失值
- dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
- fillna
7 创建新变量
- df.assign 给DataFrame添加新的一列,返回一个新的dataframe
- 也可直接df['new_col']
- pd.qcut(df.col,q,labels,precision)按分位数离散化数据
- df.clip 阈值化
df = df.assign(Area = lambda df:df.bar+df.foo)
df
df['Volumn'] = df.Area + df.foo
df
pd.cut(df.baz,3,retbins=True)#分成3类
(0 (0.995, 2.667]
1 (0.995, 2.667]
2 (2.667, 4.333]
3 (2.667, 4.333]
4 (4.333, 6]
5 (4.333, 6]
Name: baz, dtype: category
Categories (3, object): [(0.995, 2.667] < (2.667, 4.333] < (4.333, 6]],
array([ 0.995 , 2.66666667, 4.33333333, 6. ]))
df.baz.clip(lower=2,upper=3)
0 2
1 2
2 3
3 3
4 3
5 3
Name: baz, dtype: int64
8 Group Data
- df.groupby(by='col')按列分组
- df.groupby(level='ind')按某层级的索引分组
分组后返回的GroupBy Object
- size 求分组大小
- agg 使用函数对小组进行聚合
- 上述的summarize函数
- 应用到每个group,然后返回和原来的DataFrame一样大小的DataFrame
- df.shift(1)
- df.shift(-1)
- rank(method='dense')返回排序后的rank值
- rank(method='min')相等值取最小的rank值
- ...
- cumsum
- cummax
- cummin
- cumprod
df
df.groupby('foo').shift(1)#分组,每组都移动
df.groupby('foo').rank(method = 'dense')
df.rank(method = 'dense')
df.rank(method = 'min')
df.rank(pct=True)
df.baz.rank(method = 'first')
0 1.0
1 2.0
2 3.0
3 4.0
4 5.0
5 6.0
Name: baz, dtype: float64
9 Windows
- expanding累积窗
- rolling滑动窗 moving average curve with variance as shades
df.expanding(2).sum()
df.expanding(1).sum()
df.expanding(3).sum()
image.png
import numpy as np
df = pd.DataFrame(np.random.randn(1000,4),
index = pd.date_range('1/1/2000', periods=1000),
columns = ['A', 'B', 'C', 'D'])
df = df.cumsum()
df.rolling(window=60).sum().plot(subplots=True)
array([<matplotlib.axes._subplots.AxesSubplot object at 0x7fadbc4c5b70>,
<matplotlib.axes._subplots.AxesSubplot object at 0x7fadbc441e10>,
<matplotlib.axes._subplots.AxesSubplot object at 0x7fada8c15ef0>,
<matplotlib.axes._subplots.AxesSubplot object at 0x7fada8bea048>], dtype=object)
import matplotlib.pyplot as plt
plt.show()
10 绘图
df.plot.hist()
<matplotlib.axes._subplots.AxesSubplot at 0x7fada8a66518>
plt.show()
df.plot.scatter(x='A',y='B')
<matplotlib.axes._subplots.AxesSubplot at 0x7fada8905240>
plt.show()
11 Combine Data Sets
- Join pd.merge(df1,df2,how='inner',on='key')
- 过滤 df1[~df1.x1.isin(df2.x1)]
- 集合操作