我有一個具有兩個級別的多索引的資料框。給定第二級的以下示例:
d = {
"col1": [1, 2, 3, 4],
"col2": [1, 2, 3, 4],
"col3": [1, 2, 3, 4],
"col4": [1, 2, 3, 4],
"col5": [1, 2, 3, 4],
}
df = pd.DataFrame(data=d)
df.columns = pd.MultiIndex.from_product([df.columns, ["identical"]])
如何更改奇異值以使索引的第二級看起來像這樣?
['example', 'identical', 'identical', 'identical', 'identical']
我試圖這樣做:
updated_columns = list(df.columns.get_level_values(1))
updated_columns[0] = 'example'
df.columns.set_levels(
updated_columns, level=1, inplace=True, verify_integrity=False
)
在這種情況下,我的更改被忽略了。
我也嘗試過這個主題的答案:pandas MultiIndex with duplicate values in one level
df.columns = pd.MultiIndex.from_tuples(
df.columns.set_levels(updated_columns, 1, verify_integrity=False).values
)
這也被忽略了。
我也考慮過使用 rename() 方法。不幸的是,它僅在提供重命名列的值時才有效。鑒于存在相同的值,這將不起作用。
對于非多索引,有這種方法:
df.columns.values[0] = 'example'
但是從我收集的資訊來看,它不適用于多索引。
我添加了 verify_integrity=False 因為該方法不允許我設定相同的值。
任何幫助,將不勝感激。
uj5u.com熱心網友回復:
一種方法是獲取組成 MultiIndex 的元組并直接修改它們:
tuples = df.columns.tolist()
tuples[0] = (tuples[0][0], 'example')
df.columns = pd.MultiIndex.from_tuples(tuples)
輸出:
>>> df
col1 col2 col3 col4 col5
example identical identical identical identical
0 1 1 1 1 1
1 2 2 2 2 2
2 3 3 3 3 3
3 4 4 4 4 4
MultiIndexes 有點奇怪。它們存盤為級別串列(包含唯一的標簽值)和代碼(標簽的索引)。例如,當前 MultiIndex 的級別和代碼如下所示:
>>> df.columns.levels
FrozenList([['col1', 'col2', 'col3', 'col4', 'col5'], ['identical']])
>>> df.columns.codes
FrozenList([[0, 1, 2, 3, 4], [0, 0, 0, 0, 0]])
如您所見,那里只有一根'indentical'
弦。它的重復由代碼定義。
因此,如果您想example
通過操作級別和代碼將第二個級別的第一個標簽設定為,您可以這樣進行:
vals = df.columns.levels[1].tolist()
vals.append('example')
df.columns = df.columns.set_levels(vals, level=1)
df.columns = df.columns.set_codes([1, 0, 0, 0, 0], level=1) # 1 = 'example', 2 = 'identical'
這是一個可用于設定 MultiIndex 特定級別的所有標簽的函式:
def set_level_of_df(df, level_index, labels):
new_df = df.copy()
unique, inverse = np.unique(labels, return_inverse=True)
new_df.columns = new_df.columns.set_levels(unique, level=level_index)
new_df.columns = new_df.columns.set_codes(inverse, level=level_index)
return new_df
用法:
>>> df
col1 col2 col3 col4 col5
example identical identical identical identical
0 1 1 1 1 1
1 2 2 2 2 2
2 3 3 3 3 3
3 4 4 4 4 4
>>> df = set_level_of_df(df, level_index=0, labels=['aaa', 'abc', 'xyz', '0123', '-----'])
>>> df
aaa abc xyz 0123 -----
example identical identical identical identical
0 1 1 1 1 1
1 2 2 2 2 2
2 3 3 3 3 3
3 4 4 4 4 4
這是另一個函式(使用前一個函式),您可以使用它來設定 MultiIndex 特定級別的特定標簽(這是您的問題):
def set_label_of_label_of_df(df, level_index, label_index, label):
new_df = df.copy()
labels = df.columns.get_level_values(level=level_index).tolist()
labels[label_index] = label
return set_level_of_df(df, level_index, labels)
用法:
>>> df
col1 col2 col3 col4 col5
example identical identical identical identical
0 1 1 1 1 1
1 2 2 2 2 2
2 3 3 3 3 3
3 4 4 4 4 4
>>> df = set_label_of_label_of_df(df, level_index=1, label_index=3, label='THIS_IS_A_TEST_VALUE')
>>> df
col1 col2 col3 col4 col5
example identical identical THIS_IS_A_TEST_VALUE identical
0 1 1 1 1 1
1 2 2 2 2 2
2 3 3 3 3 3
3 4 4 4 4 4
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/443050.html
下一篇:ro如何讀取大量csv索引檔案