我有一个包含每小时时间索引的数据框:
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()
然而,这会返回错误
答案 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”列上。然后您将收到您要查找的结果。