如果我有一个有'count‘、'w’、'c‘、'd’和'y‘列的dataframe,那么示例数据如下所示:
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”分组的百分比变化如何?
发布于 2018-05-08 11:24:52
好的,您可以对数据进行排序(就像您已经得到的那样),然后将diff计算为count和count.shift()之间的差异。
我们将这个差异分配给dataframe,其中删除了我们不感兴趣的所有重复行和cols:
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)
返回:
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
可以添加此验证器以检查是否获得了正确的列数:
sum(df[['w','c','d']].duplicated()) == len(df)/2 # <-- This should return True
发布于 2018-05-08 11:11:53
这里有两种方法:第一种(用agg
)比第二种(transform
)更快,但为了有选择.
令人高兴的是,他们可以处理你只有两年多的时间来比较的例子。
方法1
您可以根据y
对数据进行排序,然后在pct_change()
中使用agg()
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
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
https://stackoverflow.com/questions/50240646
复制相似问题