当每个csv具有多个公用列时,如何最好地将多个csv读取到单个数据帧中

时间:2019-07-30 14:41:59

标签: python pandas

我在一个目录中有多个csv文件。所有这些文件都有两列公用。

file1.csv
common_col1    common_col2    var1    var2    var3
 abc|xyz        2018-10-07     100     200     300
 abc|xyz        2018-10-14     80      80      90
 abc|xyz        2018-10-21     34      35      36
 abc|qrs        2018-10-07     1000    2000    3000
 abc|qrs        2018-10-14     800     800     90
 abc|qrs        2018-10-21     340     350     36  


file2.csv
common_col1    common_col2    var4    var5    var6
 abc|xyz        2018-10-07     "one"   150     203
 abc|xyz        2018-10-14     "two"   38      90
 abc|xyz        2018-10-21     "three" 35      45
 abc|qrs        2018-10-07     "four"  654     678
 abc|qrs        2018-10-14     "five"  67      90
 abc|qrs        2018-10-21     "six"   25      76  

,同样是file3.csv,file4.csv等。

最后,我的结果应如下所示:

common_col1    common_col2    var1    var2    var3   var4    var5 var6

 abc|xyz        2018-10-07     100     200     300   "one"   150     203
 abc|xyz        2018-10-14     80       80      90   "two"   38      90
 abc|xyz        2018-10-21     34       35      36   "three" 35      45
 abc|qrs        2018-10-07     1000    2000    3000  "four"  654     678
 abc|qrs        2018-10-14     800      800     90   "five"  67      90
 abc|qrs        2018-10-21     340      350     36   "six"   25      76

我尝试了以下代码:

filepaths = [f for f in os.listdir("/home/csvfiles") if f.endswith('.csv')]
tmp_dump = pd.concat(map(pd.read_csv, filepaths), sort=False)

尽管这没有在tmp_dump中复制'common_col1'和'common_col2',但我不确定这是正确的做法。确实,我还在某些列中看到了所有NaN,这很奇怪!对我来说,获取单个数据框的好方法是什么?

感谢所有帮助。 库马尔

1 个答案:

答案 0 :(得分:2)

使用公共列作为索引

dir = '/home/csvfiles/'
filepaths = [dir + f for f in os.listdir(dir) if f.endswith('.csv')]

def read_csv(fp):
    return pd.read_csv(
        fp, delim_whitespace=True,
        index_col=['common_col1', 'common_col2']
    )

tmp_dump = pd.concat(map(read_csv, filepaths), sort=False, axis=1)

我还是想使用pathlib

import os
from pathlib import Path

filepaths = Path('home/csvfiles/').glob('*.csv')

def read_csv(fp):
    return pd.read_csv(
        fp, delim_whitespace=True,
        index_col=['common_col1', 'common_col2']
    )

tmp_dump = pd.concat(map(read_csv, filepaths), sort=False, axis=1)