【问题标题】:Group by Category and find Percent Change for given frequency按类别分组并查找给定频率的百分比变化
【发布时间】:2020-11-03 16:33:16
【问题描述】:

我有一个数据集 df,我希望按类别分组并找到给定频率的百分比变化

  Cat  Value       Date  
  A    1           7/1/2020
  A    2           7/2/2020     
  B    20          7/1/2020
  B    40          7/3/2020
  

期望的输出

 Cat  Diff   pct_change      Date

 A    1      100             7/2/2020                  
 B    20     100             7/3/2020

这就是我正在做的事情

df1=df.groupby(pd.Grouper(key='Cat', freq='1D')).sum()      #Group by the Cat

df1['PercentageDiff'] = df1['Value'].pct_change().mul(100)  #Find Pct_change
                   
df1['ValueDiff'] = df1['Value'].diff()                      #Find Value diff

感谢任何帮助。

【问题讨论】:

    标签: python pandas numpy


    【解决方案1】:

    我相信您希望使用DataFrame.groupby 按组工作,最后删除由DataFrame.dropna 填充的每个组的第一个值:

    df['Date'] = pd.to_datetime(df['Date'])
    
    df['Diff'] = df.groupby('Cat')['Value'].diff() 
    df['pct_change'] = df.groupby('Cat')['Value'].pct_change().mul(100)
    
    df = df.dropna(subset=['pct_change'])[['Cat','Diff','pct_change','Date']]
    print (df)
      Cat  Diff  pct_change       Date
    1   A   1.0       100.0 2020-07-02
    3   B  20.0       100.0 2020-07-03
    

    【讨论】:

    • @Lynnette - 嗯,我重命名列名并以df['Diff'] = df.groupby('Cat')['Value'].diff()df['pct_change'] = df.groupby('Cat')['Value'].pct_change().mul(100) 交换顺序,最后添加[['Cat','Diff','pct_change','Date']] 以获得预期的列顺序,你认为删除[['Cat','Diff','pct_change','Date']] 吗?跨度>
    • 它有效,我的错。我想问一下,有没有办法在这段代码中包含频率?df1=df.groupby(pd.Grouper(key='Cat', freq='1D')).sum() ??
    • @Lynnette - 您可以更改频率列的数据吗?不知道是否明白。
    • @Lynnette - 我想明白了,你认为 df1=df.groupby(['Cat', pd.Grouper(key='Date', freq='1M')])['Value'].sum().reset_index() 每月的价值吗?
    • 好的,我认为它是这样的——我会研究并以此为基础。非常感谢
    【解决方案2】:

    这应该会有所帮助:

        def f(x):
            d = {}
            d['Diff'] = x.iloc[1, 'Value'] - x.iloc[0, 'Value']
            d['Perc_change'] = 100*(x.iloc[1, 'Value'] - x.iloc[0, 'Value'])/x.iloc[0,'Value']
            d['Date'] = max(x['Data'])
            return pd.Series(d, index=['Diff', 'Perc_change', 'Date'])
        
        df['Date'] = pd.to_datetime(df.Date)
        df = df.sort('Date')
        df.groupby(['Cat']).apply(f)
    

    【讨论】:

    • 此解决方案假设每个类别只有两行数据来推断每个类别的差异和 perc-change。
    猜你喜欢
    • 1970-01-01
    • 2020-09-15
    • 1970-01-01
    • 2022-11-16
    • 2021-12-18
    • 2015-10-27
    • 1970-01-01
    • 2012-10-31
    • 2019-05-15
    相关资源
    最近更新 更多