【问题标题】:How to calculate daily user difference and reshape pandas dataframe?如何计算每日用户差异并重塑熊猫数据框?
【发布时间】:2021-01-06 11:31:51
【问题描述】:

我正在使用 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

current dataset

并且想转换(转置?)以获得每个用户的每日差异,参考上一天,按照上面的例子,想得到这个:

>>> 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

goal_table

此目标表表示用户 A 在 9 月 17 日售出了 -2 件商品,与 9 月 16 日相比。

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

【问题讨论】:

    标签: python pandas date dataset transpose


    【解决方案1】:
    • .sort_values userdate 在数据帧上
    • .groupby('user', as_index=False) 和聚合差异。
      • 如果不包含as_index=False,则会出现TypeError: rename() got an unexpected keyword argument 'columns'
    • 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
    

    【讨论】:

    • .rename(columns={'sales': 'sales_diff'} 给我以下错误:TypeError: rename() got an unexpected keyword argument 'columns' .... 或者我打破了你给定的避免重命名该列的步骤,我的工作答案如下。
    • @ssalgado 你用的是什么版本的熊猫?
    • @ssalgado 我想你忘了在 groupby 中添加 as_index=False。如果你忘记了,if 将导致TypeError: rename() got an unexpected keyword argument 'columns'
    【解决方案2】:

    根据 Trenton 的有效答案,我的 .rename() 函数出现错误,因此我添加了一个额外的步骤来解决这个问题。

    以下代码对我有用:

    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)
    #print("Original dataset\n",df,"\n")
    
    # Sort values on user and date (to obtain proper differences)
    df = df.sort_values(['user', 'date'])
    
    # Add column sales_diff that groups by user, ad .diff() in sales 
    df['sales_diff'] = df.groupby(['user'])['sales'].diff()
    #print("Added difference sales column\n",df,"\n")
    
    #Pivot table on user and sales_diff
    dfp = df.pivot(columns='date', index='user', values='sales_diff').reset_index().dropna(axis=1)
    #print("Pivot dataset on user\n",dfp,"\n")
    
    # Remove the name of the columns (e.g. date)
    dfp.columns.name = None
    
    #print("Goal dataset obtained\n")
    print(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
    

    【讨论】:

      猜你喜欢
      • 2016-10-17
      • 1970-01-01
      • 2017-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-26
      相关资源
      最近更新 更多