如何将多个原始输入 CSV 与包含名称略有不同的相似列的 pandas 合并?
How to merge multiple raw input CSV's with pandas containing similar columns with slightly different names?
我写了一些代码来组合多个 CSV,这些 CSV 用 Pandas 解释并附加到一个组合的 CSV。
我遇到的问题是,CSV 文件由多方(每月)提供,并且通常包含列名方面的差异,但它们基本上包含相同的信息。例如:
CSV 1
|编号 |实例编号 |
| ------ | -------------- |
| 1 | 401421 |
| 2 | 420138 |
CSV 2
|编号 |实例编号 |
| ------ | -------------- |
| 1 | 482012 |
| 2 | 465921 |
这将导致组合文件中有两列,实例编号和实例编号,除非我事先重命名该列,而我的想法是自动处理所有文件而无需事先干预。
应该有效的解决方案是使用 combine_first 或 fillna,但下次可能会输入该列,例如实例 No/number.
既然改进数据传输不是一种选择,有没有什么聪明的方法可以解决这样的问题,而不必写出所有可能的变化并将它们重新映射到一个前导列?
提前致谢!
我认为首先您需要有一个包含所有可能名称的字典,或者您可以在获得新名称时快速添加这些名称并重命名列名。例如
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)
简短的回答是否定的,因为您要求计算机自己思考。但是,您确实有多种选择来处理常见情况。
如果列顺序 and/or 位置固定,您可以使用 header=0, names=['ID', 'Instance']
忽略文件中发送的 header 并使用已知数据
您还可以生成一个配置文件,将所有可能的错误 header 名称映射到正确的
如果列在所有文件中的顺序相同,您可以这样尝试,
- 首先预定义列
- 首先更改所有文件本身的列名并连接数据帧
data1 = pd.read_csv('data/data1.csv')
data2 = pd.read_csv('data/data2.csv')
data1.columns = ['A', 'B', 'C']
data2.columns = ['A', 'B', 'C']
pd.concat([data1, data2], axis=0)
我写了一些代码来组合多个 CSV,这些 CSV 用 Pandas 解释并附加到一个组合的 CSV。
我遇到的问题是,CSV 文件由多方(每月)提供,并且通常包含列名方面的差异,但它们基本上包含相同的信息。例如:
CSV 1 |编号 |实例编号 | | ------ | -------------- | | 1 | 401421 | | 2 | 420138 |
CSV 2 |编号 |实例编号 | | ------ | -------------- | | 1 | 482012 | | 2 | 465921 |
这将导致组合文件中有两列,实例编号和实例编号,除非我事先重命名该列,而我的想法是自动处理所有文件而无需事先干预。
应该有效的解决方案是使用 combine_first 或 fillna,但下次可能会输入该列,例如实例 No/number.
既然改进数据传输不是一种选择,有没有什么聪明的方法可以解决这样的问题,而不必写出所有可能的变化并将它们重新映射到一个前导列?
提前致谢!
我认为首先您需要有一个包含所有可能名称的字典,或者您可以在获得新名称时快速添加这些名称并重命名列名。例如
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)
简短的回答是否定的,因为您要求计算机自己思考。但是,您确实有多种选择来处理常见情况。
如果列顺序 and/or 位置固定,您可以使用 header=0, names=['ID', 'Instance']
忽略文件中发送的 header 并使用已知数据
您还可以生成一个配置文件,将所有可能的错误 header 名称映射到正确的
如果列在所有文件中的顺序相同,您可以这样尝试,
- 首先预定义列
- 首先更改所有文件本身的列名并连接数据帧
data1 = pd.read_csv('data/data1.csv')
data2 = pd.read_csv('data/data2.csv')
data1.columns = ['A', 'B', 'C']
data2.columns = ['A', 'B', 'C']
pd.concat([data1, data2], axis=0)