[英]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
我嘗試了以下方法:
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.