场景:我有一个数据框列表。我试图重命名列并更改其顺序,但是列名称不完全匹配,例如:列可能是“ 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"})
问题:执行此操作的正确方法是什么?
答案 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} )
您无法在词典中传递列表