python - 如何计算每日用户差异并重塑熊猫数据框?
问题描述
我正在使用 Python 中的 Pandas DataFrame,目前我有以下架构:
>>> import pandas as pd
>>> d = {'date': ['15-Sep','16-Sep','17-Sep','18-Sep','15-Sep','16-Sep','17-Sep','18-Sep','15-Sep','16-Sep','17-Sep','18-Sep'],
... 'user': ['A','A','A','A','B','B','B','B','C','C','C','C'],
... 'sales': [5,8,6,7,9,12,11,11,11,15,8,6]}
>>> df = pd.DataFrame(data=d)
>>> df
date user sales
0 15-Sep A 5
1 16-Sep A 8
2 17-Sep A 6
3 18-Sep A 7
4 15-Sep B 9
5 16-Sep B 12
6 17-Sep B 11
7 18-Sep B 11
8 15-Sep C 11
9 16-Sep C 15
10 17-Sep C 8
11 18-Sep C 6
并且想转换(转置?)以获得每个用户的每日差异,参考最后一天,按照上面的例子,想得到这个:
>>> d = {'user': ['A','B','C'],
... '16-Sep': [3,3,4],
... '17-Sep': [-2,-1,-7],
... '18-Sep': [1,0,-2]}
>>> df = pd.DataFrame(data=d)
>>> df
user 16-Sep 17-Sep 18-Sep
0 A 3 -2 1
1 B 3 -1 0
2 C 4 -7 -2
此目标表表示用户 A 在 9 月 17 日售出 -2 件商品,与 9 月 16 日相比。
最好的方法是什么?关于我如何做到这一点的任何例子?我找不到类似的问题。
解决方案
.sort_values
在数据帧上由user
anddate
.groupby('user', as_index=False)
和总差。- 如果不包含,
TypeError: rename() got an unexpected keyword argument 'columns'
则会发生A。as_index=False
- 如果不包含,
df.join
结果.groupby
。.pivot
数据框和.dropna
.
import pandas as pd
# setup test dataframe
d = {'date': ['15-Sep','16-Sep','17-Sep','18-Sep','15-Sep','16-Sep','17-Sep','18-Sep','15-Sep','16-Sep','17-Sep','18-Sep'], 'user': ['A','A','A','A','B','B','B','B','C','C','C','C'], 'sales': [5,8,6,7,9,12,11,11,11,15,8,6]}
df = pd.DataFrame(data=d)
# groupby and join to df
dfg = df.sort_values(['user', 'date']).join(df.groupby('user', as_index=False)['sales'].diff().rename(columns={'sales': 'sales_diff'}))
# pivot the dataframe into the correct shape
dfp = dfg.pivot(columns='date', index='user', values='sales_diff').reset_index().dropna(axis=1)
# remove the name of the columns (e.g. date)
dfp.columns.name = None
# display(dfp)
user 16-Sep 17-Sep 18-Sep
0 A 3.0 -2.0 1.0
1 B 3.0 -1.0 0.0
2 C 4.0 -7.0 -2.0
推荐阅读
- servicenow - servicenow 从扩展表中获取价值
- javascript - jquery: check the current toggled class
- javascript - 逻辑问题:JS对象数组-检查所有object.properties不是未定义的
- scala - 为什么我需要 Scala 枚举
- python - subprocess.run 像 Popen 一样在后台执行
- python - 烧瓶模板:如何在给定变量上调用块?
- php - 从 MySQL 数据库接收数据而不重新加载页面
- android - Android 使用统计返回奇怪的结果
- php - 将 % 附加到下拉数组中的值
- java - 为什么包含 blob 的 INSERT INTO 不保留记录