pandas常用方法总结

这一阵子用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)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容