簡體   English   中英

使用periodindex在具有多索引列的數據框上進行GroupBy

[英]GroupBy on a dataframe with multiindex columns using periodindex

我有一個pivot_table生成的DataFrame ,其行有一個索引,其列有一個MultiIndex MultiIndex的頂級是我運行計算的數據的名稱,第二級是該數據的DATE。 這些值是這些計算的結果。 它看起來像這樣:

Imgur鏈接 - 我的聲譽不夠高,無法發布內嵌圖像

我試圖按季度(例如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 lengthValueError響應, 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()

這有效

因為我的代表太低,所以imgur鏈接到數據幀圖像

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM