我有大约300个CSV文件,我想用Pandas 将它们合并成一个文件.它们都有3行变量名(第一行中的Project、第二行中的Device_1和第三行中的Variable). 第一列类似于(‘Asset’,‘Element’,‘Date’),继续时间序列的值.有时名称是其他语言的,但有100个文件的第一行是(‘ts’,nan,nan),所以我需要替换多重索引名称的第一个"列",以便能够在完成合并文件后按日期对其进行排序.

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

因此,基本上我想要的是多索引名称的第一列,与我的新_COLLES值相同

                 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

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

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’),当我try 将其与其他文件合并时,最终的数据帧有两个日期时间列.

我try 使用SET_LEVES,但必须将VERIFY_INTEGRATION设置为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_INTEGRATION标记为FALSE,最终的名称就会混淆,我不知道为什么.

有没有办法用given position替换MultiIndex中的任何名称?比如说像ILOC之类的,

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

推荐答案

将多索引转换为元组列表并设置新值:

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

或者您可以使用helper 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

Python相关问答推荐

Python:MultiIndex Dataframe到类似json的字典列表

如何对行使用分段/部分.diff()或.pct_change()?

获取Azure Pipelines以从pyproject.toml(而不是relevments_dev.文本)安装测试环境

如何在telegram 机器人中发送音频?

使用Python Great Expectations和python-oracledb

在Python中使用一行try

过载功能是否包含Support Int而不是Support Int?

使文本输入中的文本与标签中的文本相同

如何使用stride_tricks.as_strided逆转NumPy数组

计算所有前面行(当前行)中列的值

如何才能知道Python中2列表中的巧合.顺序很重要,但当1个失败时,其余的不应该失败或是0巧合

根据在同一数据框中的查找向数据框添加值

. str.替换pandas.series的方法未按预期工作

梯度下降:简化要素集的运行时间比原始要素集长

组/群集按字符串中的子字符串或子字符串中的字符串轮询数据框

部分视图的DataFrame

在www.example.com中使用`package_data`包含不包含__init__. py的非Python文件

python panda ExcelWriter切换动态公式到数组公式

如何使用OpenGL使球体遵循Python中的八样路径?

在方法中设置属性值时,如何处理语句不可达[Unreacable]";的问题?