python - 当每个 csv 具有多个公共(public)列时,如何最好地将多个 csv 读入单个数据帧

标签 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,这很奇怪!我获取单个数据帧的好方法是什么?

感谢大家的帮助。 库马尔

最佳答案

使用公共(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/

相关文章:

python - 无法安装 tensorflow 压缩

python - 发布一个 python 包——你应该包括文档和测试吗?

python - 从 itertools.chain 对象获取一个数组

python - python 函数如何将其所有变量放在全局命名空间中?

Python Pandas 使用 Fastparquet 将 CSV 转换为 Parquet

python - 生成帕斯卡三角形的极端情况

python - 对于不一致的日期范围,用零填充 pandas groupby

python - 如何将填充应用于1?

python - 在 pandas 数据框中重复行

python - 获取 pandas python 中每个类别/组的重复值计数