pandas 替换所有级别中第n个位置的MultiIndex名称

bkhjykvo  于 2024-01-04  发布在  其他
关注(0)|答案(1)|浏览(84)

我有大约300个CSV文件,我想合并成一个单一的使用Pandas。所有这些都有3行变量名(第一列是project,第二列是Device_1,第三列是variable)。('Asset','Element ','Date')并继续时间序列值。有时名称是其他语言的,但有100个文件的第一行是('ts',nan,nan),所以我需要替换MultiIndex名称的第一个“列”,以便在完成合并文件后能够按日期对其进行排序。

df.iloc[:3,:5]
Out[16]: 
                    ts       Asset_1                                             
                   nan      Device_1                        Device_2     Device_3
                   nan     Variable_1         Variable_2  Variable_1    Variable_1
0  2022-12-31 00:00:00         0.0                NaN          0.0          0.0
1  2022-12-31 00:05:00         0.0                NaN          0.0          0.0
2  2022-12-31 00:10:00         0.0                NaN          0.0          0.0

字符串
因此,基本上我希望多索引名称的第一个“列”与我的new_index值相同

Asset       Asset_1                                             
                 Device      Device_1                        Device_2     Device_3
                 Date       Variable_1         Variable_2  Variable_1    Variable_1
0  2022-12-31 00:00:00         0.0                NaN          0.0          0.0
1  2022-12-31 00:05:00         0.0                NaN          0.0          0.0
2  2022-12-31 00:10:00         0.0                NaN          0.0          0.0


到目前为止,我已经尝试了三个层次的迭代:

new_cols = ['Asset','Element','Date']
for i in range(3):
    df.rename(columns={df.columns[0][i]:new_cols[i]},inplace=True)


然而,由于此方法不按位置替换,而是按名称替换,由于第二行和第三行具有相同的名称(nan),因此最终名称为('Asset','Date ','Date'),并且当我尝试将其与其他文件合并时,最终命名框有两个datetime列。
我尝试使用set_levels,但我必须将verify_integrity设置为False,否则我会收到一个错误:

new_cols = ['Asset','Element','Date']
for i in range(3):
updated_columns = [new_cols[i]] + list(df.columns.get_level_values(i)[1:])
df.columns.set_levels(updated_columns,level=i,verify_integrity=True)

ValueError: Level values must be unique: ['Asset', 'Asset_1','Asset_1','Asset_1','Asset_1'] on level 0


但是,如果我将verify_integrity标记为False,那么最终的名称就会混淆,我不知道为什么。
有没有一种方法可以用给定的位置替换MultiIndex中的任何名称?

pd.Multiindex.iloc[0,2]='Date'

uurv41yg

uurv41yg1#

将MultiIndex转换为元组列表并设置新值:

new_cols = ['Asset','Element','Date']

L = df.columns.tolist()
L[0] = tuple(new_cols)
print (L)
[('Asset', 'Element', 'Date'), 
 ('Asset_1', 'Device_1', 'Variable_1'), 
 ('Asset_1', 'Device_1', 'Variable_2'), 
 ('Asset_1', 'Device_2', 'Variable_1'), 
 ('Asset_1', 'Device_3', 'Variable_1')]

df.columns = pd.MultiIndex.from_tuples(L)
print (df)
                 Asset    Asset_1                                 
               Element   Device_1              Device_2   Device_3
                  Date Variable_1 Variable_2 Variable_1 Variable_1
0  2022-12-31 00:00:00        0.0        NaN        0.0        0.0
1  2022-12-31 00:05:00        0.0        NaN        0.0        0.0
2  2022-12-31 00:10:00        0.0        NaN        0.0        0.0

字符串
或者你也可以使用辅助DataFrame,但更慢:

new_cols = ['Asset','Element','Date']

df1 = df.columns.to_frame()
df1.iloc[0] = new_cols

df.columns = pd.MultiIndex.from_frame(df1, names=df.columns.names)
print (df)
                 Asset    Asset_1                                 
               Element   Device_1              Device_2   Device_3
                  Date Variable_1 Variable_2 Variable_1 Variable_1
0  2022-12-31 00:00:00        0.0        NaN        0.0        0.0
1  2022-12-31 00:05:00        0.0        NaN        0.0        0.0
2  2022-12-31 00:10:00        0.0        NaN        0.0        0.0

相关问题