给定数据框中的列重命名,因为该列包含循环中的数据

时间:2018-07-09 13:31:19

标签: python pandas dataframe

场景:我有一个数据框列表。我试图重命名列并更改其顺序,但是列名称不完全匹配,例如:列可能是“ iterationlist”或“ iteration”。

我尝试在循环内循环以读取所有列,如果名称包含我需要的内容,请更改该列的名称,但出现错误:

TypeError: unhashable type: 'list'

代码:

import pandas as pd
import os
from Tkinter import Tk
from tkFileDialog import askdirectory
from os import listdir
from os.path import isfile, join
import glob

# Get content
mypath = "//DGMS/Desktop/uploaded"
all_files = glob.glob(os.path.join(mypath, "*.xls*"))
contentdataframes = [pd.read_excel(f).assign(Datanumber=os.path.basename(f).split('.')[0].split('_')[0], ApplyOn='')
     for f in all_files]

#get list of dates and put to dfs

for dfs in contentdataframes:
    dfs.rename(index=str, columns={[col for col in dfs.columns if 'iteration' in col]: "iterationlistfinal"})

问题:执行此操作的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

我认为需要str.contains来通过子字符串获取列名称,然后通过将两个列表都连接在一起来按子集对列进行重新排序:

contentdataframes = []

for f in all_files:
    df = pd.read_excel(f)
    df['Datanumber'] = os.path.basename(f).split('.')[0].split('_')[0]
    df['ApplyOn']= ''
    mask = df.columns.str.contains('iteration')
    c1 = df.columns[mask].tolist()
    c2 = df.columns[~mask].tolist()
    df = df[c1 + c2]
    contentdataframes.append(df)

答案 1 :(得分:0)

古老,但是解决方案很简单

dfs.rename(index=str, columns={col : "iterationlistfinal" for col in dfs.columns if 'iteration' in col} )

您无法在词典中传递列表