Python Pandas

将表组合起来

1
2
pd.concat([df1, df2, df3], axis = 0)
#0是在行叠加,1是列叠加
1
2
3
4
5
6
7
8
9
10
11
pd.merge(left, right, how = 'inner', left_on=None, right_on=None, left_index=False, right_index=False, ...)

#两个表有相同的分类column--key1和key2来进行表的组合
pd.merge(left, right, how = 'inner', on = ['key1', 'key2'])

#如果两个链接的column的name不一样
pd.merge(left, right, how = 'inner', left_on = ['key1', 'key2'], right_on = ['key1_right', 'key2'])

#如果一个表的key1和key2是column, 另外一个是index,
#注:两者在表中的顺序要一样,且index将会全部选入
pd.merge(left, right, how = 'inner', left_on = ['key1', 'key2'], right_index = True)

数据透视表pivot

1
2
 pd.pivot_table(df, index = 'y', columns = 'x', values = 'z', aggfunc = np.mean)
#可以加入多个行,多个列等

交互表cross-table

1
2
 pd.crosstab(index = 'y', columns = 'x', values = 'z', aggfunc = '...', margins = True/False)
#aggfunc 默认为frequency

读取和存储数据

1
2
pandas.read_csv(filepath, sep = ',')
Dataframe.to_csv(path, sep = ',')

创建dataframe or series

1
2
3
4
d = pd.dataframe(data, index)

s = pd.Series(data, index = index)
#data 可以是字典、数组、实数

常用操作

df.loc 索引的是标签名
df.iloc索引的是索引位置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#切片
df[1:10]
df.loc[0] #选取的是标签名为0的那行
df.loc[x, y]
df.iloc[0] #选取的是第1行
#列选取
df[[col1, col2]]
#重命名
df.rename()
#删除重复值
df.drop_duplicates(subset = )
#计算频次
df[col1].value_counts()
#过滤
df[(df["height"] > 180) & (df["weight"] >80)]
df.loc[(df['height'] > 180)& (df['weight'] > 80)]
df.query("height >= 180 & weight >=80")
#新增加一列
df[newcol] = value
df.loc[(df['height'] <= 200) & (df['height'] >= 180), 'label'] = 'Middle'
#排序
df.sort_index(inplace = True, na_position = 'first')

设定索引

1
2
3
df.set_index(keys = ['col1','col2'],drop = True,append = False,inplace = True)
df.reset_index(level = [0,1],drop = False, inplace = True)
#append 为是否保留原索引

多重索引

1
2
3
4
5
#三重索引为例
#对于第二个索引不进行限定
df.loc[('[col1]', slice(None), ['col3']), :)
#选取第一个索引的x与y内的行
df.loc[(slice('x','y'),slice(None),['col3']),:]

分组计算groupby

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#groupby
g1 = df.groupby('col_name')

#使用函数
g1.mean()
g1[['x', 'y']].mean()

#同时使用多个函数,使用numpy
import numpy as np
g1[["height","weight"]].aggregate(np.mean,np.sum,np.median)

#不同列不同函数
g1.aggregate({"height":np.sum,"weight":np.mean})

#使用transformation——每个函数是作用在每一个group的column上,且返回新的数据集,不改变原有数据集
f = lambda s: (s - s.mean()) / s.std()
g1.transform(f) #将每一个group里面的每一个column的标准化

#filtration,从原有数据集中筛选符合条件的数据,且filter的函数必须作用在整个group上
g1.filter(lambda s : len(s) >= 80)
找出那些含有80条以上的group里面的所有数据