2017-07-18 144 views
1

我有每小時時間指數數據幀:計算在熊貓數字和非數字列的日平均

     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

使用'pandas.DataFrame.resample()'和適當的聚合函數。 – DyZ

+1

請提一下你到目前爲止所嘗試的內容 –

+0

@MoinuddinQuadri,用我試過的代碼更新。謝謝! – user308827

回答

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

根據[docs](https://toolz.readthedocs.io/en/latest/api.html#toolz.dicttoolz.merge),merge將'* args'作爲一個列表。但我可能會錯 - 我有一段時間沒有使用'toolz'和'cytoolz'。 – MSeifert

+1

你是對的。但是,它似乎是寬容的。我會更新。 – piRSquared

+0

偉大的soln,謝謝! – user308827

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」列上。然後你會收到你要找的結果。

相關問題