Pandas 0.22.0循环排序DataFrame遇KeyError问题求助
问题分析与解决方案
看起来你遇到的问题根源在于**sorts列表的格式错误**,导致sort_values方法无法正确识别你要排序的列。
为什么会报错?
你定义的sorts列表中,类似"'SITE', 'DEPARTMENT', 'LOCATION', 'ASSET_TYPE', 'ASSET_NAME'"的元素是单个字符串,但pandas.DataFrame.sort_values()的by参数需要的是列名字符串的列表,而不是一个包含多个列名的字符串。
当你传入这个字符串时,Pandas会误认为你要找一个名为'SITE', 'DEPARTMENT', 'LOCATION', 'ASSET_TYPE', 'ASSET_NAME'的列(整个字符串作为列名),而你的DataFrame里显然没有这个列,所以抛出KeyError。
修复方案
把sorts列表中那些多列的元素改成真正的Python列表,而不是带引号的字符串。修改后的sorts应该是这样的:
sorts = [ ['SITE', 'DEPARTMENT', 'LOCATION', 'ASSET_TYPE', 'ASSET_NAME'], 'ASSET_TYPE_NAME', 'ASSET_STATUS_NAME', ['SITE_NAME', 'LOCATION_NAME'], 'DEPARTMENT_NAME', 'SITE_NAME', 'USER_NAME' ]
修改后的完整代码
替换原来的sorts定义即可,其他代码保持不变:
import pandas import sys reload(sys) sys.setdefaultencoding('utf-8') reportDF = ["assetReport", "assetTypeReport", "assetStatusReport", "locationReport", "departmentReport", "siteReport", "userReport"] sheetNames = ["Asset Report", "Asset Types", "Asset Status", "Locations", "Cost Centers", "Sites", "Users"] columnNames = [("EPC", "Creation Date", "Modification Date", "Inventory Date", "Asset Name", "Asset Status", "Asset Type", "Asset User", "Location", "Site", "Cost Center", "Description"), "Asset Type Name", ("Asset Status", "Asset Status Description"), ("Location Name", "EPC", "Floor", "GPS", "Capacity", "Lead Time", "Site Name"), "Cost Center", ("Site", "Country", "Postal Code", "City", "Address", "GPS"), ("User Name", "User Role", "First Name", "Last Name", "Email", "User Disabled?")] # 修复后的sorts列表 sorts = [ ['SITE', 'DEPARTMENT', 'LOCATION', 'ASSET_TYPE', 'ASSET_NAME'], 'ASSET_TYPE_NAME', 'ASSET_STATUS_NAME', ['SITE_NAME', 'LOCATION_NAME'], 'DEPARTMENT_NAME', 'SITE_NAME', 'USER_NAME' ] writer = pandas.ExcelWriter('mergedSheet.xlsx') for i in range(0, 7): df = pandas.read_csv(reportDF[i], delimiter=';') df = df.sort_values(by=sorts[i]) df.to_excel(writer, sheet_name=sheetNames[i], engine='xlsxwriter', header=columnNames[i], freeze_panes=(1, 0)) writer.save() writer.close()
额外注意事项
请确保sorts中的列名和你CSV文件中的列名完全匹配(包括大小写),如果CSV里的列名是小写的site而不是大写的SITE,也要对应修改,否则还是会出现KeyError。
内容的提问来源于stack exchange,提问作者Usman Muhammad Nooruddin
相关产品推荐
相关产品推荐

