计算pandas中数字和非数字列的每日平均值

时间:2017-07-18 22:57:58

标签: python pandas

我有一个包含每小时时间索引的数据框:

                     wind_direction     relative_humidity  
dates                                                 
2017-07-18 19:00:00              W                88  
2017-07-18 20:00:00              N                88  
2017-07-18 21:00:00              W                90  
2017-07-18 22:00:00              S                91  
2017-07-18 23:00:00              W                93  

如何计算每日平均值,以便对于数字列,我们计算每日平均值,对于非数字列,我们输出最多次出现的值。

- 编辑:

我这样做了:

df = df.resample('D').mean()

然而,这会返回错误

2 个答案:

答案 0 :(得分:3)

选项1

from cytoolz.dicttoolz import merge

ncols = df.select_dtypes([np.number]).columns
ocols = df.columns.difference(ncols)

df.index = pd.to_datetime(df.index)

d = merge(
    {c: 'mean' for c in ncols},
    {c: lambda x: pd.value_counts(x).index[0] for c in ocols}
)

df.resample('D').agg(d)

            relative_humidity wind_direction
dates                                       
2017-07-18                 90              W

​

选项2

df.index = pd.to_datetime(df.index)

g = df.resample('D')
g.mean().combine_first(g.agg(lambda x: pd.value_counts(x).index[0]))[df.columns]

            relative_humidity wind_direction
dates                                       
2017-07-18                 90              W

答案 1 :(得分:1)

如果您想计算多个列的每日统计数据,我认为分而治之可能是一个不错的选择。

第一步是如何按日期汇总。

df['dates'] = pd.to_datetime(df['dates'])
df['Date'] = df['dates'].apply(lambda dt: dt.date())

第二步是如何计算每天最常见的方向。

group1 = df.groupby(by=['Date'],as_index = False)['wind_direction'].agg(lambda dt:dt.value_counts(ascending=False).index[0])

第三步是如何计算日均值,类似于第二步。

最后一步是将它们合并在“Date”列上。然后您将收到您要查找的结果。