接下来介绍 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)








网友评论