[英]GroupBy on a dataframe with multiindex columns using periodindex
我有一個pivot_table
生成的DataFrame
,其行有一個索引,其列有一個MultiIndex
。 MultiIndex
的頂級是我運行計算的數據的名稱,第二級是該數據的DATE。 這些值是這些計算的結果。 它看起來像這樣:
我試圖按季度(例如Q42018)對這些數據進行分組,而不是每一天(數據的原生格式)。
我發現這篇帖子使用PeriodIndex和GroupBy將日期索引轉換為四分之一/年的索引,使其更加優雅並且最有意義。
問題是此解決方案適用於僅包含單個索引列的數據框。 我遇到了一個問題,試圖這樣做,因為我的列是一個多索引,我無法弄清楚如何讓它工作。 這是我到目前為止的嘗試:
bt = cleaned2018_df.pivot_table(index='Broker',
values=['Interaction Id','Net Points'],
columns='Date',
aggfunc={'Interaction Id':pd.Series.nunique,
'Net Points':np.sum},
fill_value=0)
pidx = pd.PeriodIndex(bt.columns.levels[1], freq='Q')
broker_qtr_totals = bt.groupby(pidx, axis=1, level=1).sum()
正如您所看到的,我正在抓住包含所有日期的MultiIndex
的第二級,並通過PeriodIndex
函數運行它以獲取四分之一的索引。 然后我將PeriodIndex
傳遞給groupby,並告訴它操作列和日期所在的第二級。
這將返回Grouper and axis must be same length
的ValueError
響應, Grouper and axis must be same length
。 我知道原因是因為我傳遞給GroupBy的pidx
值是長度x,而數據幀的列軸長度是2x(因為multiindex的第1級有2個值)。
我只是想知道如何正確地將它應用於整個索引。 我似乎無法在語法上弄明白,所以我想依靠社區的專業知識來看看是否有人可以幫助我。
如果我的解釋不明確,我很樂意進一步澄清。 先感謝您。
我想出了這個,並且我將發布答案以防其他有類似問題的人來到這里。 我正在考慮問題,但在我的第一次嘗試中有一些錯誤。
長度錯誤是由於我將MultiIndex
的第二級顯式引用傳遞給PeriodIndex
函數,然后將其傳遞給groupby。 更好的解決方案是使用.get_level_values
函數,因為它考慮了索引的多級特性,並根據更高級別中有多少項返回適當的值。
例如 - 如果你有一個帶有2個級別的MultiIndex列的DataFrame - 這2個級別每個包含3個值,那么你的表將有9個列,因為頂層的每個值都會分解出更低的級別。 我的初始解決方案是直接從第二級獲取這3個值,而不是全部9. get_level_values
更正。
第二個問題是我將這個PeriodIndex
對象PeriodIndex
傳遞給groupby。 這將有效,但它基本上只是忽略MultiIndex的頂級。 因此,您需要確保傳入包含原始頂級的列表,以及要分組的新的第二級。
更正代碼:
#use get_level_values instead of accessing levels directly
pIdx = pd.PeriodIndex(bt.columns.get_level_values(1), freq='Q')
# to maintain original grouping, pass in a list of your original top level,
# and the new second level
broker_qtr_totals = bt.groupby(by=[bt.columns.get_level_values(0), pidx],
axis=1).sum()
這有效
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.