【问题标题】:Loop through Multiple CSV Files and Merge with Specific Columns [Pandas]循环多个 CSV 文件并与特定列合并 [Pandas]
【发布时间】:2021-04-25 07:48:52
【问题描述】:

我有一个 csv 文件列表。每个文件有 5 列,“id”作为唯一的公共列(主键)。其余 4 列都不同。

我的兴趣点是第 5(最后)列,每个文件都不同。我想将它们合并到“id”上。

我尝试了以下代码,但它以行方式连接,给了我太多重复的“id”和“NaN”值:

filelist = glob.glob(path + "/*.csv")

li = []

for filename in filelist:

    df = pd.read_csv(filename, index_col=None, header=0, usecols=[0,5])

    li.append(df)

frame = pd.concat(li, axis=0, ignore_index=True)

我想将它们逐列连接到我的兴趣点列(第 5 列)。

例如

我的文件列表:['df1.csv', 'df2.csv', 'df3.csv', 'df4.csv']

df1.csv 具有以下结构:

   ID  No1 AA
0   1   0   4
1   2   1   5
2   3   0   6

df2.csv 有这样的结构:

   ID  No2 BB
0   2   0   5
1   3   1   6
2   4   0   7

名单还在继续。我想要的输出是:

    ID  AA  BB  CC  DD
0   1   4.0 NaN 0   1
1   2   5.0 5.0 1   0
2   3   6.0 6.0 1   0
3   4   NaN 7.0 1   1

任何建议将不胜感激。谢谢。

【问题讨论】:

  • 读入数据时,可以设置id为索引列。然后在所有数据帧上运行pd.join。或使用第一个数据帧作为左侧数据帧,其他数据帧作为右侧数据帧并在id 索引上合并

标签: python pandas dataframe csv merge


【解决方案1】:

仅使用第一列和最后一列合并 ID:

df = df1.iloc[:,[0,-1]].merge(df2.iloc[:,[0,-1]],on="ID",how="outer")

第一次合并后,您只需要:

df = df.merge(df3.iloc[:,[0,-1]],on="ID",how="outer")

使用中:

import pandas as pd

data1 = {"ID":[1,2,3], "No1":[0,1,0], "AA":[4,5,6]}
data2 = {"ID":[2,3,4], "No2":[0,1,0], "BB":[5,6,7]}
data3 = {"ID":[1,3,4], "No2":[0,1,0], "CC":[2,3,4]}

df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
df3 = pd.DataFrame(data3)

df = df1.iloc[:,[0,-1]].merge(df2.iloc[:,[0,-1]],on="ID",how="outer")
print(df.merge(df3.iloc[:,[0,-1]],on="ID",how="outer"))

输出:

   ID   AA   BB   CC
0   1  4.0  NaN  2.0
1   2  5.0  5.0  NaN
2   3  6.0  6.0  3.0
3   4  NaN  7.0  4.0

【讨论】:

    【解决方案2】:

    从您的示例开始,将“ID”设置为索引并隐式加入它似乎是最简单的(只需使用-1 数字索引按位置检索最后一列):

    import pandas as pd
    
    filelist = [
        '/tmp/csvs/df1.csv',
        '/tmp/csvs/df2.csv',
    ]
    
    result = pd.DataFrame()
    
    for f in filelist:
        df = pd.read_csv(f, sep='\s+').set_index('ID')
        last_col = df.columns[-1]
        result = result.join(df[last_col], how='outer')
    result.reset_index(inplace=True)
    
    result
    
    Out[1]: 
       ID   AA   BB
    0   1  4.0  NaN
    1   2  5.0  5.0
    2   3  6.0  6.0
    3   4  NaN  7.0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-11
      • 2021-04-28
      • 1970-01-01
      • 2019-11-08
      • 2021-02-23
      • 2016-09-17
      • 2015-10-25
      • 1970-01-01
      相关资源
      最近更新 更多