使用python或pandas合并许多文件

时间:2016-11-14 21:58:32

标签: python pandas dataframe

我根据特定条件合并多个文件(最多20个或更多)。下面是三个文件示例:

File1           
ID  Type    Condition   Colour
113884  M   Good    Green
123456  M   Good    Blue
178101  U   Good    Yellow
245645  U   Good    Red
256178  X   Fair    Green
803989  X   Poor    Red

File2           
ID  Type    Condition   Colour
113884  M   Good    Green
123456  M   Good    Blue
172221  M   Poor    Red
178101  U   Good    Yellow
256178  X   Fair    Green

File 3          
ID  Type    Condition   Colour
113884  M   Good    Green
123456  M   Good    Blue
172221  M   Poor    Red
178101  U   Good    Yellow
178101  U   Good    Yellow
256178  X   Fair    Green
286762  Q   Good    Purple

我想在这些文件中提取和合并类似的信息,如下面所需的输出。在所有文件中,任何一行都有' Type' M和Q与它们的ID一起被提取,因此在输出文件中,文件名然后变成字段列,表示“是”'或者没有'如果ID和类型包含在文件中。

必需输出(.csv):

ID  Type    File 1  File2   File3
113884  M   Yes Yes Yes
123456  M   Yes Yes Yes
172221  M   No  Yes Yes
286762  Q   No  No  Yes

这是我的不充分尝试:

import os, glob

all_line =[]
for file in golob.glob('*.txt'):
    infile = open('file', 'r')
    for line in file:
        line=line.strip.split('\t')
        if line[1]=='M' or line[1]=='Q':
            all_line.append(line)

我不知道如何使用python或pandas来做到这一点。有人可以帮忙吗?谢谢。

1 个答案:

答案 0 :(得分:3)

IIUC你可以这样做:

import os
import glob
import pandas as pd

files = glob.glob(r'D:\temp\.data\File*.csv')

def merge_files(files, **kwargs):
    dfs = []
    for f in files:
        dfs.append(
            pd.read_csv(f, delim_whitespace=True, usecols=['ID','Type'])
              .query("Type in ['M','Q']")
              .drop_duplicates()
              .assign(col=0)
              .rename(columns={'col':os.path.splitext(os.path.basename(f))[0]})
              .set_index(['ID','Type'])
        )
    return pd.concat(dfs, axis=1).notnull()


result = merge_files(files).reset_index()
print(result)

输出:

       ID Type  File1  File2 File3
0  113884    M   True   True  True
1  123456    M   True   True  True
2  172221    M  False   True  True
3  286762    Q  False  False  True