如何打印所有CSV文件共有的列名

时间:2019-09-16 20:20:39

标签: python pandas

我整理了一些我认为可以打印出文件夹中所有CSV文件通用的列名称的代码。我正在使用内部联接,但它的作用类似于外部联接。对此必须有一个快速修复。

import glob
import pandas as pd

files = glob.glob(r'C:\my_files\*.csv')

def get_merged(files, **kwargs):
    df = pd.read_csv(files[0], **kwargs)
    for f in files[1:]:
        df = df.merge(pd.read_csv(f, **kwargs), how='inner')
    return df

print(get_merged(files))

因此,如果我有4个文件包含以下列:

 cola   colb    colc    cold    cole

我有1个文件包含这些列:

cola    colc    cole

我想看这个:

cola    colc    cole

2 个答案:

答案 0 :(得分:1)

您可以使用pandas或纯Python计算列名的set-intersection。

1)熊猫解决方案

def get_common_columns(files, **kwargs):
    """Get set intersection of column-names of specified CSV files"""
    common_columns = set(pd.read_csv(files[0], nrows=0, **kwargs).columns)
    for f in files[1:]:
        common_columns &= set(pd.read_csv(f, nrows=0, **kwargs).columns)
    return common_columns
  • 我对此进行了测试并且有效
  • 熊猫不是矫not过正:仅读取列名而不读取数据,只需执行pd.read_csv(..., nrows=0)然后取set(df.columns)
  • 原来我们不能使用merge / join。甚至merge(..., how='inner')都采用并集而不是列的交集。仅供参考merge works on column-names, whereas join works on indices。但是他们逐行加入

2)具有csvset()

的本机Python解决方案
  • 相同的想法,只是在本地Python中
  • csv读入列标题,然后在列名上使用set()交集,反复:common_columns |= set(columns_from_current_csv)

答案 1 :(得分:0)

来自Stack上的另一个答案:

import csv
from glob import iglob

unique_headers = set()
for filename in iglob('*.csv'):
    with open(filename, 'rb') as fin:
        csvin = csv.reader(fin)
        unique_headers.update(next(csvin, []))

print(unique_headers)

How can I read only the header column of a CSV file using Python?