关于python:如何打印所有CSV文件共有的列名

How to print column names that are common to all CSV files

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

1
2
3
4
5
6
7
8
9
10
11
12
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个文件包含以下列:

1
 cola   colb    colc    cold    cole

我有1个包含以下列的文件:

1
cola    colc    cole

我想看这个:

1
cola    colc    cole


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

1)大pandas解决方案

1
2
3
4
5
6
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

  • 我测试了它并且有效
  • pandas并不过分:仅读取列名而不读取数据,只需执行pd.read_csv(..., nrows=0)然后取set(df.columns)
  • 原来我们不能使用merge / join。即使merge(..., how='inner')也采用并集而不是列的交集。 FYI merge适用于列名,而join适用于索引。但是他们逐行加入

2)带有csvset()的本机Python解决方案

  • 同样的想法,只是在本机Python中
  • csv读取列标题,然后在列名称上使用set()交集,反复:common_columns |= set(columns_from_current_csv)


来自堆栈上的另一个答案:

1
2
3
4
5
6
7
8
9
10
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)

如何使用Python读取CSV文件的标题列?