首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从熊猫数据中获取YoY百分比

从熊猫数据中获取YoY百分比
EN

Stack Overflow用户
提问于 2018-05-08 19:01:57
回答 2查看 1.9K关注 0票数 1

如果我有一个有'count‘、'w’、'c‘、'd’和'y‘列的dataframe,那么示例数据如下所示:

代码语言:javascript
运行
复制
131    1    dir    mob    2017
244    1    dir    mob    2018
311    1    org    mob    2017
332    1    org    mob    2018
212    2    dir    dsk    2017
311    2    dir    dsk    2018
401    2    org    mob    2017
283    2    org    mob    2018

2018年和2017年的“计数”值按“w”、“c”、“d”分组的百分比变化如何?

EN

回答 2

Stack Overflow用户

发布于 2018-05-08 19:24:52

好的,您可以对数据进行排序(就像您已经得到的那样),然后将diff计算为count和count.shift()之间的差异。

我们将这个差异分配给dataframe,其中删除了我们不感兴趣的所有重复行和cols:

代码语言:javascript
运行
复制
import pandas as pd

data = '''\
count  w      c      d       y
131    1    dir    mob    2017
244    1    dir    mob    2018
311    1    org    mob    2017
332    1    org    mob    2018
212    2    dir    dsk    2017
311    2    dir    dsk    2018
401    2    org    mob    2017
283    2    org    mob    2018'''

df = pd.read_csv(pd.compat.StringIO(data), sep='\s+')

df.sort_values(by=['w','c','d','y'], inplace=True) # <--- sort values 

diff = (df['count'].shift(-1) - df['count'])/df['count'][::2] # <--- calculate % change

dfnew = df.drop_duplicates(('w','c','d')).drop(['y','count'],axis=1).assign(diff=diff)

print(dfnew)

返回:

代码语言:javascript
运行
复制
   w    c    d      diff
0  1  dir  mob  0.862595
2  1  org  mob  0.067524
4  2  dir  dsk  0.466981
6  2  org  mob -0.294264

可以添加此验证器以检查是否获得了正确的列数:

代码语言:javascript
运行
复制
sum(df[['w','c','d']].duplicated()) == len(df)/2  # <-- This should return True
票数 5
EN

Stack Overflow用户

发布于 2018-05-08 19:11:53

这里有两种方法:第一种(用agg)比第二种(transform)更快,但为了有选择.

令人高兴的是,他们可以处理你只有两年多的时间来比较的例子。

方法1

您可以根据y对数据进行排序,然后在pct_change()中使用agg()

代码语言:javascript
运行
复制
df['pct'] = df.sort_values('y').groupby(['w', 'c', 'd']).agg({'count':'pct_change'})

>>> df
   count  w    c    d     y       pct
0    131  1  dir  mob  2017       NaN
1    244  1  dir  mob  2018  0.862595
2    311  1  org  mob  2017       NaN
3    332  1  org  mob  2018  0.067524
4    212  2  dir  dsk  2017       NaN
5    311  2  dir  dsk  2018  0.466981
6    401  2  org  mob  2017       NaN
7    283  2  org  mob  2018 -0.294264

方法2

类似的,但使用transform()而不是agg

代码语言:javascript
运行
复制
df['pct'] = df.sort_values('y').groupby(['w', 'c', 'd']).transform(lambda x: x.pct_change())['count']

>>> df
   count  w    c    d     y       pct
0    131  1  dir  mob  2017       NaN
1    244  1  dir  mob  2018  0.862595
2    311  1  org  mob  2017       NaN
3    332  1  org  mob  2018  0.067524
4    212  2  dir  dsk  2017       NaN
5    311  2  dir  dsk  2018  0.466981
6    401  2  org  mob  2017       NaN
7    283  2  org  mob  2018 -0.294264
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50240646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档