![](/img/trans.png)
[英]How to consolidate multiple CSV files with similar and different columns into 1 using Python and Pandas?
[英]Python - How to join multiple csv files sharing similar data, but in additional columns?
我需要将多个 .csv 文件合并为一个,它们共享第一列的大部分功能,但第二列有变量,这些变量会因文件而异。 我的挣扎:我想让第一列在每次我写的时候都会更新(附加?),第二列将其功能分配给第一列中的每一列,并且还添加了一个新列。
例子:
Dataset1.csv
plane1,100
plane2,100
plane3,400
plane5,600
plane4,700
Dataset2.csv
plane1,150
plane3,100
plane4,300
Dataset3.csv
plane3,300
plane4,250
plane6,180
我希望他们最终成为:
output.csv
plane1,100,150,-
plane2,100,-,-,-
plane3,400,100,300
plane4,700,300,250
plane5,600,-,-
plane6,-,-,180
任何帮助表示赞赏。
这解决了您似乎遇到的确切问题:
import pandas as pd
df1 = pd.read_csv('Dataset1.csv', header=None, index_col=0)
df2 = pd.read_csv('Dataset2.csv', header=None, index_col=0)
df3 = pd.read_csv('Dataset3.csv', header=None, index_col=0)
df = pd.concat([df1,df2,df3], axis=1)
df.to_csv('output.csv')
假设您有 3 个数据框。
df1:
df1 = pd.DataFrame({'plane':['plane1','plane2','plane3','plane4','plane5'],
'value':[100,100,400,600,700]})
输出:
plane value
0 plane1 100
1 plane2 100
2 plane3 400
3 plane4 600
4 plane5 700
df2:
df2 = pd.DataFrame({'plane':['plane1','plane3','plane4'],
'value':[150,100,300]})
输出:
plane value
0 plane1 150
1 plane3 100
2 plane4 300
df3:
df3 = pd.DataFrame({'plane':['plane3','plane4','plane6'],
'value':[300,250,180]})
输出:
plane value
0 plane3 300
1 plane4 250
2 plane6 180
跑:
mid_res = pd.merge(df1,df2,how='outer',on='plane')
result = pd.merge(mid_res,df3,how='outer',on='plane')
输出:
plane value_x value_y value
0 plane1 100.0 150.0 NaN
1 plane2 100.0 NaN NaN
2 plane3 400.0 100.0 300.0
3 plane4 600.0 300.0 250.0
4 plane5 700.0 NaN NaN
5 plane6 NaN NaN 180.0
如果您希望 NaN 显示为“-”。 跑:
result = result.fillna('-')
得到:
plane value_x value_y value
0 plane1 100 150 -
1 plane2 100 - -
2 plane3 400 100 300
3 plane4 600 300 250
4 plane5 700 - -
5 plane6 - - 180
现在您可以导出 CSV 文件:
result.to_csv('result.csv')
当 'plane' 列中的值是唯一的时,concat 解决方案有效。
如果这回答了您的问题,请投票。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.