首页 > 解决方案 > 如何计算每日用户差异并重塑熊猫数据框?

问题描述

我正在使用 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 日相比。

最好的方法是什么?关于我如何做到这一点的任何例子?我找不到类似的问题。

标签: pythonpandasdatedatasettranspose

解决方案


  • .sort_values在数据帧上由useranddate
  • .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

推荐阅读