我的目录中有多个 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,这很奇怪!我获取单个数据帧的好方法是什么?
感谢大家的帮助。 库马尔
最佳答案
使用公共(public)列作为索引
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)
关于python - 当每个 csv 具有多个公共(public)列时,如何最好地将多个 csv 读入单个数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57274311/