【问题标题】:I want to take the average price of each unique value in each month我想取每个月每个唯一值的平均价格
【发布时间】:2020-02-21 15:47:03
【问题描述】:

我正在使用日历数据集来预测不同房屋的价格,其日期特征包括一年中的 365 天。我想通过在新列中获取每个列表的平均月价来最小化数据集。

 input data:
listing_id  date       price    months
    1       2020-01-08  75.0    Jan
    1       2020-01-09  100.0   Jan
    1       2020-02-08  350.0   Feb
    2       2020-01-08  465.0   Jan
    2       2020-02-08  250.0   Feb
    2       2020-02-09  250.0   Feb

Output data:
listing_id  date        Avg_price      months
    1       2020-01-08  90.0           Jan
    1       2020-02-08  100.0          Feb
    2       2020-01-08  50.0           Jan
    2       2020-02-08  150.0          Feb

【问题讨论】:

    标签: python date time-series average feature-engineering


    【解决方案1】:

    您可以使用groupby获取每个月的平均价格:

    g = df.groupby("months")["price"].mean()
    

    然后您可以创建新列:

    for month, avg in g.iteritems():
        df["average_{}".format(month)] = avg
    

    虚拟数据示例:

    import pandas as pd
    df = pd.DataFrame({'months':['Jan', 'Feb', 'Feb', 'Mar', 'Mar', 'Mar'],
                       'price':[1, 2, 3, 4, 5, 6]})
    

    结果:

      months  price  average_Feb  average_Jan  average_Mar
    0    Jan      1          2.5          1.0          5.0
    1    Feb      2          2.5          1.0          5.0
    2    Feb      3          2.5          1.0          5.0
    3    Mar      4          2.5          1.0          5.0
    4    Mar      5          2.5          1.0          5.0
    5    Mar      6          2.5          1.0          5.0
    

    【讨论】:

    • 我不确定你是否理解我的意思。有一个列表 ID 列、价格列和月份列。我想创建一个 average_Jan 列来获取每个列表 ID 在 1 月份的平均价格。
    • 您能否提供一些示例数据和预期输出?它使给出准确答案变得容易得多。听上去你还想通过列出 id 来分组...?
    • 谢谢,我用输入和所需的输出数据编辑了我的问题。
    【解决方案2】:

    我赞成丹的回答。
    看看另一种方法可能会有所帮助。
    此外,如果您有跨越多年的数据,您可能需要一个 month_year 列。
    参考:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.pivot_table.html

    例子:

    df = pd.DataFrame({'price':[i for i in range(121)]},
                      index=pd.date_range(start='12/1/2017',end='3/31/2018'))
    df = df.reset_index()
    df['month_year'] = df['index'].dt.month_name() + " " + 
                       df['index'].dt.year.astype(str)
    df.pivot_table(values='price',columns='month_year')
    

    结果:

    In [39]: df.pivot_table(values='price',columns='month_year')
    Out[39]: 
    month_year  December 2017  February 2018  January 2018  March 2018
    price                15.0           75.5          46.0       105.0
    
    

    【讨论】:

    • 谢谢,这是我想要的,但每个列表的平均价格。我用示例编辑了我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多