我整理了一些我认为可以打印出文件夹中所有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
答案 0 :(得分:1)
您可以使用pandas或纯Python计算列名的set-intersection。
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
pd.read_csv(..., nrows=0)
然后取set(df.columns)
merge
/ join
。甚至merge(..., how='inner')
都采用并集而不是列的交集。仅供参考merge
works on column-names, whereas join
works on indices。但是他们逐行加入csv
和set()
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?