问题描述
我编写了一些代码来组合多个用 Pandas 解释并附加到一个组合 CSV 的 CSV。
我遇到的问题是 CSV 文件由多方(每月)提供,并且通常包含列名称方面的差异,而它们基本上包含相同的信息。例如:
CSV 1 |身份证 |实例编号 | | -------- | -------------- | | 1 | 401421 | | 2 | 420138 |
CSV 2 |身份证 |实例编号 | | -------- | -------------- | | 1 | 482012 | | 2 | 465921 |
这将导致合并文件中有两列,Instance Number 和 Instance NO,除非我事先重命名该列,而想法是在没有事先干预的情况下自动处理所有文件。
应该工作的解决方案是使用 combine_first 或 fillna,但下次可以输入该列,例如实例编号/编号。
既然改进数据交付不是一种选择,那么有没有什么聪明的方法来解决此类问题,而不必写出所有可能的变体并将它们重新映射到一个主要列?
提前致谢!
解决方法
我认为首先您需要有一个包含所有可能名称的字典,或者您可以在获得新名称时快速添加这些名称并重命名列名称。例如
general_dict = { 'SLNO': ['Sl No','SNo']}
col_list = all_df.columns.to_list()
rename_dict = {}
for col in col_list:
for key,val in general_dict.items():
if col in val:
rename_dict[col] = key
break
all_df.rename(columns=rename_dict,inplace=True)
,
简短的回答是否定的,因为您要求计算机自己思考。但是,您确实有多种选择来处理常见情况。
如果列顺序和/或位置是固定的,您可以使用 header=0,names=['ID','Instance']
忽略文件中发送的标题并使用已知数据
您还可以生成一个配置文件,将所有可能的错误标头名称映射到正确的标头名称
,如果所有文件中的列顺序相同,您可以这样尝试,
- 首先预定义列
- 首先更改所有文件的列名并连接数据帧
data1 = pd.read_csv('data/data1.csv')
data2 = pd.read_csv('data/data2.csv')
data1.columns = ['A','B','C']
data2.columns = ['A','C']
pd.concat([data1,data2],axis=0)