【问题标题】:How to merge multiple csv files into one file with specific columns on pandas, python?如何将多个 csv 文件合并为一个文件,其中包含 pandas、python 上的特定列?
【发布时间】:2019-11-13 19:54:49
【问题描述】:

我有 4 个不同的 csv 文件。

csv1:

ID      Fruit
1001    Apple
1002    Banana
1003    Kiwi

csv2:

ID      Color
1001    Green
1005    Red
1006    Orange
1007    Yellow

csv3:

ID      Size
1001    Large
1008    Small
1009    Medium
1010    Large

csv4:

ID      Price
1002    20
1009    40
1010    30
1011    50

这是我要制作的主 csv 文件:

Number  ID      Fruit   Color   Size    Price

1       1001    Apple   Green   Large   
2       1002    Banana                  20
3       1003    Kiwi            
4       1005            Red     
5       1006            Orange      
6       1007            Yellow      
7       1008            Small   
8       1009            Medium          40
9       1010            Large           30
10      1011                            50

我认为使用 pandas 会更容易实现,但我不知道 Python

由于每个 csv 文件都有不同的列,我如何选择列并将它们全部粘贴到主 csv 文件上? 如果没有信息,我想将其设为 NULL 或 N/A 值。

您可以看到每个 csv 文件和主文件: Click here for image

我已经花了 6 个小时,但我不知道该怎么做。

提前谢谢你。

【问题讨论】:

  • 如果我使用 pandas 可以吗?
  • @AndreyBerenda 实际上我可以使用任何东西

标签: python pandas


【解决方案1】:

reduce + combine_first

关键是将'ID' 设置为索引,这样我们就可以在两个轴上正确对齐。我假设所有 DataFrame 都在内存中,但如果不是,您可以将它们读入列表,或者在 reduce 步骤中进行读取。

from functools import reduce

my_dfs = [df.set_index('ID') for df in [df1, df2, df3, df4]]
#my_dfs = [pd.read_csv(file).set_index('ID') for file in your_list_of_files]

reduce(lambda l,r: l.combine_first(r), my_dfs)

       Color   Fruit  Price    Size
ID                                 
1001   Green   Apple    NaN   Large
1002     NaN  Banana   20.0     NaN
1003     NaN    Kiwi    NaN     NaN
1005     Red     NaN    NaN     NaN
1006  Orange     NaN    NaN     NaN
1007  Yellow     NaN    NaN     NaN
1008     NaN     NaN    NaN   Small
1009     NaN     NaN   40.0  Medium
1010     NaN     NaN   30.0   Large
1011     NaN     NaN   50.0     NaN

【讨论】:

  • 您好,我正在使用这个解决方案来解决我的问题,这是相同的,但是在运行 reduce 后我得到了 Killed 错误...我该如何解决这个问题?
  • @user3224522 很可能你组合了太多的帧,所以你使用了太多的内存或太多的计算时间。如果是内存问题,这是最有可能的,基本上你需要更多(买一些,或者使用,或者需要分块处理。
  • 非常感谢您的评论,如果您想看看并给我一些建议,我已经解决了这样的问题 (stackoverflow.com/questions/66367399/…)。
【解决方案2】:

这样的事情应该可以工作:

import pandas as pd

list_of_csv_filenames = ['csv1.csv', 'csv2.csv', 'csv3.csv', 'csv4.csv']
all_dfs = []
for i in range(1, 5):
    temp = pd.read_csv(list_of_csv_filesnames[i-1])
    temp['Number'] = i
    all_dfs.append(temp)
full_df = pd.concat(all_dfs)
full_df.to_csv('output_filename.csv', index=False)

【讨论】:

    【解决方案3】:

    你可以使用合并:

    import pandas as pd
    
    df1 = pd.read_csv('1.csv')
    df2 = pd.read_csv('2.csv')
    df3 = pd.read_csv('3.csv')
    df4 = pd.read_csv('4.csv')
    df = df1.merge(df2).merge(df3).merge(df4)
    df.to_csv('result.csv')
    

    【讨论】:

    • how='outer' 需要添加到每个合并中,这在这种情况下有效,因为 "每个 csv 文件都有不同的列"
    猜你喜欢
    • 1970-01-01
    • 2018-06-11
    • 2014-05-17
    • 2021-04-25
    • 2020-07-10
    • 2019-10-11
    • 2021-04-28
    • 2016-09-17
    • 1970-01-01
    相关资源
    最近更新 更多