【问题标题】:Pandas find mean of values for specific time period熊猫找到特定时间段的平均值
【发布时间】:2022-01-08 20:41:08
【问题描述】:

这是我第一次在这里发帖,希望我做得对。我已经在论坛中搜索了我的问题,即使有相关主题,也没有人解决我的具体问题,所以我希望你能帮助我。

我有一个包含两列简化的数据框,如下所示:

    Date         Value
0   20010425     1
1   20010112     4
2   20010308     3
3   20010527     5
4   20010620     2

第一列以 yyyymmdd 格式表示日期,但为 int64。 现在我想创建一个额外的列,它为每一行分别取前 3 个月的值的平均值:

      Date       Value     Mean_Value_past_3_months
0   20010425     1         3.5                      #(4+3)/2
1   20010130     4         NaN                      # since no date earlier than 20010130 is available 
2   20010308     3         4                        
3   20010527     5         2                        # (1+3)/2
4   20010620     2         3                        # (1+5)/2

然后我想删除 NaN,所以它不计算它们向前移动。

我尝试转置日期然后做,这是我在这里找到的:

s = subset.columns[0:].values < df.values[:,None]
df['mean'] = (subset.iloc[:,0:]*t).mean(1)

但它 a) 它还不能工作,并且 b) 不包括 3 个月的期限。

感谢您的帮助!!

【问题讨论】:

    标签: pandas mean


    【解决方案1】:

    您想如何定义“前三个月”有点模棱两可,但您可以做以下事情:

    import pandas as pd
    
    df = pd.DataFrame({"Date": [20010425, 20010112, 20010308, 20010527, 20010620],
                       "Value": [1, 4, 3, 5, 2]
                       })
    # define a custom function that computes the mean of the last three months
    def get_mean(row):
        # choose the correct dates here using the passed row parameter:
        # e.g.
        yyyymmdd_start = row["Date"] - 300
        yyyymmdd_end = row["Date"]
    
        selected_dates = df[(df['Date'] > yyyymmdd_start) & (df['Date'] < yyyymmdd_end)]
    
        return selected_dates["Value"].mean()
    
    df["Mean_Value_past_3_months"] = df.apply(get_mean, axis=1)
    
    print(df)
    
    Out[115]: 
           Date  Value  Mean_Value_past_3_months
    0  20010425      1                       3.0
    1  20010112      4                       NaN
    2  20010308      3                       4.0
    3  20010527      5                       2.0
    4  20010620      2                       3.0
    

    【讨论】:

    • 您好安德烈,非常感谢您的帮助!当您说“在此处选择正确的日期”时,您的意思是什么?因为每一行的开始日期不同,然后我分别查看每一行的过去 3 个月。你能详细说明一下吗? (仅供参考:代码有效,但它确实给了我一个最早日期的值,它不应该)
    • get_mean() 函数中,row 参数包含该行的信息。所以row["Date"] 是传递行的日期值(对于索引为 3 的行,这将是20010527。我为这个值减去 300 以获得 3 个月前的日期(格式为 yyyymmdd)。这不是t 最佳,但它只是从给定行中的日期获得 3 个月的简单方法。这就是为什么我说选择正确的方法。selected_dates 然后是仅包含所选时间间隔内的行的 DataFrame( 3 个月)最后,函数返回值的平均值。希望对您有所帮助
    • 正如 Phil Leh 在下面所做的那样,您可以通过将日期格式转换为 pandas 原生使用的格式来让您的生活更轻松。这开辟了更多的可能性。
    • 绝对有道理,谢谢!
    【解决方案2】:

    另一种方法是将整数日期转换为日期时间并使用pandas.DataFrame.rolling 功能,如下所示:

    import pandas as pd
    
    df['Date'] = pd.to_datetime(dates, format='%Y%m%d')
    
    # Sorting by Date, because rolling() need monotonic dates
    df = df.sort_values('Date')
    
    # Using approximately 30 days per month -> 90 day for 3 months, hence '90D'
    df['Means'] = df.rolling('90D', on='Date', closed='left').mean()['Value']
    print(df)
    

    这将导致:

            Date  Value  Means
    1 2001-01-30      4    NaN
    2 2001-03-08      3    4.0
    0 2001-04-25      1    3.5
    3 2001-05-27      5    2.0
    4 2001-06-20      2    3.0
    

    【讨论】:

    • 非常感谢菲尔! V 有帮助!
    猜你喜欢
    • 1970-01-01
    • 2019-11-24
    • 2021-03-10
    • 1970-01-01
    • 2017-09-12
    • 2022-01-11
    • 2013-03-24
    相关资源
    最近更新 更多