簡體   English   中英

根據另一列的名稱重命名Pandas Multiindex

[英]Rename Pandas Multiindex based on another column's name

我有一個CSV文件,該文件以無法更改的格式生成。 該文件具有multiindex:兩行中的標題。 當值不變時,第一行(較高級別的索引)為空白。

我的標題如下所示:

標頭會像這樣

它實際上歸結為我想要的:

標頭實際上是什么

我希望能夠在Python 2.7中使用Pandas正確處理它。

我導致在第一級索引上循環,如果該值為空白,則將其設置為與左側的相同。

我首先在pandas中加載數據框:

df = pd.read_csv(myFile, header=[0,1], sep=',')
df

數據框已加載到Pandas中

我嘗試了以下方法:

for i, val in enumerate(df.columns.values):
    if val[0][:7] == 'Unnamed':
        l.append([l[i-1][0], val[1]])
    else:
        l.append(val)

我得到的列表“ l”似乎是我想要的:

[('Foo', 'A'),
 ['Foo', 'B'],
 ['Foo', 'C'],
 ('Bar', 'A'),
 ['Bar', 'B'],
 ['Bar', 'C']]

我都嘗試過:

df.columns = l 

產生一個非多索引數據框

平面數據框

index = pd.MultiIndex.from_tuples(l)
df.reindex(columns = index)

這個給了我正確的索引,但是值消失了。

消失的價值

我有一種強烈的直覺,我正在嘗試的整個方法不是很pythonic,使用列表然后轉換為字典也沒有意義。 知道如何正確進行多索引嗎?

無需使用reindex ,而是直接將列設置為新索引:

df.columns = pd.MultiIndex.from_tuples(l)

那應該產生期望的結果。

reindex不僅替換索引值(盡管聽起來像應該做的那樣,而且文檔也不是很清楚)。 相反,它將遍歷您的新索引,選擇與新索引匹配的行或列,並將NaN放在沒有舊索引與新索引匹配的位置。 這就是您正在發生的事情:當reindex擊中['Foo', 'B'] (原始數據幀中不存在)時,它將用NaN填充新數據幀中的列。

如果您的列始終遵循一致的模式(例如,每三個第二級列一個頂級列),則還可以使用MultiIndex.from_product來創建列索引:

iterables = [["Foo", "Bar"], ["A", "B", "C"]]
index = pd.MultiIndex.from_product(iterables)

暫無
暫無

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

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