【问题标题】:Mean of a grouped-by pandas dataframe按熊猫数据框分组的平均值
【发布时间】:2018-02-01 00:47:37
【问题描述】:

我需要计算列的平均每天的持续时间和公里数 value ==1 和 values = 0 的行。

df
Out[20]: 
                          Date duration km   value
0   2015-03-28 09:07:00.800001    0      0    0
1   2015-03-28 09:36:01.819998    1      2    1
2   2015-03-30 09:36:06.839997    1      3    1 
3   2015-03-30 09:37:27.659997    nan    5    0 
4   2015-04-22 09:51:40.440003    3      7    0
5   2015-04-23 10:15:25.080002    0      nan  1

我怎样才能修改这个解决方案以获得duration_value0、duration_value1、km_value0和km_value1的平均值?

df = df.set_index('Date').groupby(pd.Grouper(freq='d')).mean().dropna(how='all')
print (df)
            duration   km
Date                     
2015-03-28       0.5  1.0
2015-03-30       1.5  4.0
2015-04-22       3.0  7.0
2015-04-23       0.0  0.0

【问题讨论】:

    标签: python pandas dataframe group-by pandas-groupby


    【解决方案1】:

    我相信由Datevalue 组成一个小组应该这样做。 调用dfGroupBy.mean 后跟df.reset_index 以获得您想要的输出:

    In [713]: df.set_index('Date')\
               .groupby([pd.Grouper(freq='d'), 'value'])\
               .mean().reset_index(1, drop=True)
    Out[713]: 
                duration   km
    Date                     
    2015-03-28       0.0  0.0
    2015-03-28       1.0  2.0
    2015-03-30       NaN  5.0
    2015-03-30       1.0  3.0
    2015-04-22       3.0  7.0
    2015-04-23       0.0  NaN
    

    【讨论】:

    • 很好的答案。我有另一个想法,我以后可能会也可能不会发布。
    • @piRSquared 谢谢 :) 是否涉及设置多索引和堆叠?
    • 谢谢!但是我想将日期保留为索引,并有 4 个表示没有值列的列
    • 后跟unstack
    • @gabboshow 它看起来怎么样?但我认为这次 Bharath 打败了我。
    【解决方案2】:

    我认为您正在寻找数据透视表,即

    df.pivot_table(values=['duration','km'],columns=['value'],index=df['Date'].dt.date,aggfunc='mean')
    

    输出:

    持续时间公里 值 0 1 0 1 日期 2015-03-28 0.0 1.0 0.0 2.0 2015-03-30 NaN 1.0 5.0 3.0 2015-04-22 3.0 NaN 7.0 NaN 2015-04-23 NaN 0.0 NaN NaN 在[24]中:

    如果您想要新的列名,例如 distance0,distance1 ...您可以使用列表推导,即如果您将数据透视表存储在 ndf

    ndf.columns = [i[0]+str(i[1]) for i in ndf.columns]
    

    输出:

    持续时间0 持续时间1 km0 km1 日期 2015-03-28 0.0 1.0 0.0 2.0 2015-03-30 NaN 1.0 5.0 3.0 2015-04-22 3.0 NaN 7.0 NaN 2015-04-23 NaN 0.0 NaN NaN

    【讨论】:

    • 嗨,我发现有时“值”列中的值全为 0 或全为 1。 0 和 1 的情况......(当然,如果 value 中的值都是 0,则 case == 1 的平均值将为 0)
    • 嗨,我如何更改聚合窗口(在本例中为 .dt.date)并将其设置为例如 1 小时?您的方法是否可以使用 pd.Grouper(freq=freq_aggregation) 作为 freq_aggregation 所需的频率?
    • @gabboshow 我为你的新问题添加了我的答案。