接下来介绍 pandas 的基本操作中,大体相当于 Excel 的合计、小计 (subtotal) 和数据透视表的方法。pandas 的数据统计功能比 Excel 强大很多,方式也更加灵活。Excel 问题之一就是数据的存储和显示不分离,而 pandas 和数据库处理方式类似,数据的存储和显示分离。
计算合计数
使用上一篇的 Excel 文件作为分析的数据源,假如需要对各个月份以及月份合计数进行求和。pandas 可以对 Series
运行 sum()
方法来计算合计:
import pandas as pd
import numpy as np
df = pd.read_excel('http://pbpython.com/extras/excel-comp-data.xlsx');
df['Total'] = df.Jan + df.Feb + df.Mar
# sum_row 的类型是 pandas.core.series.Series, Jan, Feb 等成为 Series 的 index
sum_row = df[['Jan', 'Feb', 'Mar', 'Total']].sum()
也可以将 sum_row
转换成 DataFrame
, 以列的方式查看。DataFrame
的 T
方法实现行列互换。
# 转置变成 DataFrame
df_sum = pd.DataFrame(data=sum_row).T
df_sum
如果想要把合计数放在数据的下方,则要稍作加工。首先通过 reindex()
函数将 df_sum
变成与 df
具有相同的列,然后再通过 append()
方法,将合计行放在数据的后面:
# 转置变成 DataFrame
df_sum = pd.DataFrame(data=sum_row).T
# 将 df_sum 添加到 df
df_sum = df_sum.reindex(columns=df.columns)
# append 创建一个新的 DataFrame
df_with_total = df.append(df_sum, ignore_index=True)
分类汇总
Excel 的分类汇总功能,在数据功能区,但因为分类汇总需要对数据进行排序,并且分类汇总的数据与明细数据混在一起,个人很少用到,分类汇总一般使用数据透视表。
而在 pandas 进行分类汇总,可以使用 DataFrame
的 groupby()
函数,然后再对 groupby()
生成的 pandas.core.groupby.DataFrameGroupBy
对象进行求和:
df_groupby = df[['state','Jan', 'Feb','Mar', 'Total']].groupby('state').sum()
df_groupby.head()
数据格式化
pandas 默认的数据显示,没有使用千分位分隔符,在数据较大时,感觉不方便。如果需要对数据的显示格式化,可以自定义一个函数 number_format()
,然后对 DataFrame
运行 applymap(number_format)
函数。applymap()
函数对 DataFrame
中每一个元素都运行 number_format
函数。number_format
函数接受的参数必须为标量值,返回的也是标量值。
# 数字格式化
def number_format(x):
return "{:,.0f}".format(x) # 使用逗号分隔,没有小数位
formated_df = df_groupby.applymap(number_format)
formated_df.head()
数据透视表
pandas 运行数据透视表,使用 pivot_table()
方法。熟练使用 pivot_table()
需要一些练习。这里只是介绍最基本的功能:
- index 参数: 按什么条件进行汇总
- values 参数:对哪些数据进行计算
- aggfunc 参数:aggregation function,执行什么运算
# pivot table
# pd.pivot_table 生成一个新的 DataFrame
df_pivot = pd.pivot_table(df, index=['state'], values=['Jan','Feb','Mar','Total'], aggfunc= np.sum)
网友评论