分享一下最近使用Pandas遇到的一些问题

243 阅读3分钟

本文已参与[新人创作礼]活动,一起开启掘金创作之路。

背景介绍:最近用户需要制作一份基于时间维度的统计数据比较表,鉴于想一步到位把自主权交给用户,所以开放了灵活的字段选择功能,背后逻辑基于此进行动态SQL的拼接,但是实际使用下来发现效率并不是很满意。接下来借鉴了一些网络的经验类似SAIKU ,KOLIN 或者OLAP的方式,但大多都止步于太过强大的全家桶需求,如此的小需求似乎有点劳师动众;接下来,尝试了一下PANDAS的效果,就实现来说非常好上手,处理速度上也非常满意,但是数据的整理上也花了不少时间的摸索尝试,所以特此分享总结一下遇到的一些小问题。

举例数据如下:

image.png

此处分享代码比较有感觉

import pandas as pd
import numpy as np
data={
    "报表日期":['2021-12-31','2022-02-28','2021-12-31','2022-02-28','2022-02-28'],
    "营销机构":['上海','北京','浙江','成都','浙江'],
    "营销人员":['小海','小金','小江','小都','小浙'],
    "分润比例%":[20,10,8,3,8],
    "营业收入":[123,456,789,1002,898],
    "余额":[999,1000,1001,1002,643]
    }
df=pd.DataFrame(data)
df

接下来我们用pivot_table直出一张基于营销机构的营收,余额统计表,和EXCEL一样非常简单

df2 =pd.pivot_table(df, values=['营业收入','余额'], 
index=['营销机构','分润比例%'], columns=['报表日期'], aggfunc=np.sum , fill_value=0 )
df2

image.png

显然如果纯粹基于合计统计以上的操作就完成了,但是此类基于日期纬度的统计报表目的是为了进行差异比较,那基于这样就有了以下的操作基于两个日期区间的计算 效果如下

df2['余额差异']=df2.iloc[:,1]-df2.iloc[:,0]
df2['营业收入差异']=df2.iloc[:,3]-df2.iloc[:,2]
df2

image.png

此处基于iloc取值,纯粹是因为以上的格式,无法使用指定名称直接取值而不得已的方法

使用指定名称取值,你会得到如下的结果

df2['营业收入']

image.png

如果只是基于这样的一个固定格式需求,至此一切也都可以算圆满完成,但是实际工作中,往往需要能够如同EXCEL一样, 让用户灵活选取INDEX,以及VALUE,以满足不通纬度分析的目的,那以上的绝对定位似乎就不能够灵活的满足需求了

那修改列名就变成迫切需要解决的问题了,这样的方法是可行的,修改后效果如下:

#此处我们新建一个dataframe,以示区别
df3 =    pd.pivot_table(df, values=['营业收入','余额'], index=['营销机构','分润比例%'], columns=['报表日期'], aggfunc=np.sum , fill_value=0 )
df3.columns =[s1 + str(s2) for (s1,s2) in df3.columns.tolist()]
df3

image.png

但是这样的格式显然还有一些奇怪,在以下操作之后,列都平整到一行中了,那接下来的取值就易如反掌了,具体代码如下

df3.reset_index(inplace=True)
df3['余额差异']=df3['余额2022-02-28']-df3['余额2021-12-31']
df3['营业收入差异']=df3['营业收入2022-02-28']-df3['营业收入2021-12-31']
df3

image.png

至此数据已整理成我需要的格式,接下来单独封装成一个方法或webservice就能为我所用啦~~~