这一阵子用django在做报表展示的项目,其中大量数据都要进行处理,于是想到pandas这个库,用它来进行数据的分析和处理,记录一下项目过程中pandas的一些使用经验。
1.to_dict()方法
这个方法在项目中使用的特别频繁,前端需要的数据都是json格式。
从pandas官网中的截图可以看出有几种格式,我用jupyter notebook分别演示下。
QQ图片20180907154512.png
import pandas as pd
import numpy as np
df = pd.DataFrame(np.arange(12).reshape(3,4),columns=['A','B','C','D'])
df
A B C D
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
df.to_dict('dict') # 默认是dict
{'A': {0: 0, 1: 4, 2: 8},
'B': {0: 1, 1: 5, 2: 9},
'C': {0: 2, 1: 6, 2: 10},
'D': {0: 3, 1: 7, 2: 11}}
df.to_dict('list')
{'A': [0, 4, 8], 'B': [1, 5, 9], 'C': [2, 6, 10], 'D': [3, 7, 11]}
df.to_dict('series')
{'A': 0 0
1 4
2 8
Name: A, dtype: int64, 'B': 0 1
1 5
2 9
Name: B, dtype: int64, 'C': 0 2
1 6
2 10
Name: C, dtype: int64, 'D': 0 3
1 7
2 11
Name: D, dtype: int64}
df.to_dict('split')
{'index': [0, 1, 2],
'columns': ['A', 'B', 'C', 'D'],
'data': [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]]}
df.to_dict('records') # 使用频繁
[{'A': 0, 'B': 1, 'C': 2, 'D': 3},
{'A': 4, 'B': 5, 'C': 6, 'D': 7},
{'A': 8, 'B': 9, 'C': 10, 'D': 11}]
df.to_dict('index') # 使用频繁,一般报表的横坐标为日期,将date作为Index
{0: {'A': 0, 'B': 1, 'C': 2, 'D': 3},
1: {'A': 4, 'B': 5, 'C': 6, 'D': 7},
2: {'A': 8, 'B': 9, 'C': 10, 'D': 11}}
2.dataframe转换数据类型
# astype用于强制转换
df.dtypes
A int64
B int64
C int64
D int64
dtype: object
# df['A] 是一个series df[['A']]是一个DataFrame
df['A'] = df['A'].astype(float)
df.dtypes
A float64
B int64
C int64
D int64
dtype: object
# 从django数据库中如果字段的类型是Decial的话,在dataframe中是object类型,需要转化为float
# 接受series,能智能的将数字字符串转换为int或float
pd.to_numeric()
df = pd.DataFrame([['0','1','2','3'],['4','5','6','7']], columns=['A','B','C','D'])
df.dtypes
A object
B object
C object
D object
dtype: object
df['A'] = pd.to_numeric(df['A'])
df.dtypes
A int64
B object
C object
D object
dtype: object
3.dataframe groupby方法
# 以A做groupby并做sum操作,可以看出如果有数值类型求和,其他类型的sum后会,列会自动清除掉
df = pd.DataFrame([['0',1,'boy',3],['0','5','girl',7]], columns=['A','B','C','D'])
df.groupby('A').sum()
D
A
0 10
# 以A做groupby并做sum操作,可以看出1和'5',不同类型的操作会自动过滤掉,字符串会合并
df = pd.DataFrame([['0',1,'boy','3'],['0','5','girl','7']], columns=['A','B','C','D'])
df.groupby('A').sum()
C D
A
0 boygirl 37
# groupby之后所选的列名字会自动成为索引
4.dataframe中map,applymap,apply方法的总结
- map方法
df = pd.DataFrame(np.arange(12).reshape(3,4),columns=['A','B','C','D'])
df
A B C D
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
# map方法用于series中的每一个元素进行函数操作
# 给B这一列都加1
df['B'] = df['B'].map(lambda x: x+1)
# 给B这一列中等于5的元素加1
def addOne(x):
if x==5:
return x+1
return x
df['B'] = df['B'].map(addOne)
- applymap方法
df = pd.DataFrame(np.random.randn(12).reshape(3,4),columns=['A','B','C','D'])
df
A B C D
0 0.488080 -0.975596 -0.672978 0.423008
1 -0.196965 -1.658634 0.225660 0.061116
2 -0.914242 0.558322 0.255590 0.292854
# applymap方法用于对dataframe中的每一个元素进行操作
# 比如对dataframe保留两位小数,数据是随机数,所以不一样,注意小数位数 =.=
formater = '{:.2f}'.format
df = df.applymap(formater)
df
A B C D
0 -0.53 -0.86 0.39 0.17
1 2.75 -1.35 -1.08 1.14
2 0.62 1.29 0.23 1.07
- apply方法
# DataFrame.apply(func, axis=0, broadcast=False, raw=False, reduce=None, args=(), **kwds),自由度最高的函数
df = pd.DataFrame(np.arange(12).reshape(3,4),columns=['A','B','C','D'])
df
A B C D
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
# apply方法用于对dataframe中行或列进行操作
# 这个函数需要自己实现,函数的传入参数根据axis来定,比如axis = 1,就会把一行数据作为Series的数据
#结构传入给自己实现的函数中,我们在函数中实现对Series不同属性之间的计算,返回一个结果,则apply函数
#会自动遍历每一行DataFrame的数据,最后将所有结果组合成一个Series数据结构并返回。
# 比如对dataframe中的列求和,axis=0 or index对列操作 axis=1 or columns对行操作 ***这是一个很实用的方法
df = df.apply(lambda x: x.sum)
A 12
B 15
C 18
D 21
dtype: int64
5.dataframe索引操作
df = df.set_index('A') # 设置索引
df.reset_index() # 重置索引,索引会成为一列
df.reset_index(drop=True) # 删除索引,生成新的索引
# ***重点***
df.reindex(index=None, columns=None, axis=None, method=None, fill_value=nan)
# reindex将会重新排序,缺失值则用NaN填补 fill_value用于填充缺失值
method=’ffill’前向填充
method=’bfill’后向填充
6.对dataframe行名和列名重命名操作
columnsMap = {
'A':'AAA',
'B':'BBB'
}
df.rename(columnsMap, axis='columns', inplace=True) # 通过字典映射来修改名字 inplace=True 代表修改当前df,修改列的名字
df.rename(index = indexMap, inplace=True) # 通过字典映射来修改名字,修改索引的名字
7.对dataframe缺失值和被除数是0的操作
#nan缺失值
df.fillna(0, inplace=True) # 将df的nan用0代替
#在df中进行除法操作时,被除数是0的话,值是inf
#替换inf的值
import numpy as np
df = df.replace(np.inf, 0)