我有大约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'
型
1条答案
按热度按时间uurv41yg1#
将MultiIndex转换为元组列表并设置新值:
字符串
或者你也可以使用辅助DataFrame,但更慢:
型