【问题标题】:How to print column names that are common to all CSV files如何打印所有 CSV 文件共有的列名
【发布时间】:2020-01-17 16:59:04
【问题描述】:

我编写了一些代码,我认为这些代码可以打印文件夹中所有 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

【问题讨论】:

  • 内部merge 将基于公共索引合并,而不是基于公共列的 IIRC。因此,您获得大量列是有道理的。
  • 你想要merge 而不是joinmerge 作用于列名,而join 作用于索引
  • Pandas 有点矫枉过正。你愿意接受没有 pandas 的解决方案吗?
  • 我只想要列名,然后读入所有这些数据毫无价值。抓住标题然后set.intersection(或Index.intersection)就是你所需要的。
  • 抱歉,这不是一个骗局(我认为 OP 坚持使用熊猫),不应该被关闭;同样奇怪的是,pd.merge(..., how='inner') 仍然 采用列的并集(而不是交集);它只删除常见的行而不是列。我修改了我的答案。

标签: python pandas


【解决方案1】:

您可以使用 pandas 或纯 Python 来计算列名的集合交集。

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
  • 我对此进行了测试,它有效
  • pandas 并不过分:只读取列名而不读取数据,只需执行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)

【讨论】:

  • 我知道现在发生了什么。我可能问了我原来的问题略有错误。我刚刚稍微更新了我的问题。我想在 CSV 文件的文件夹中找到所有文件中出现的列名。
  • 原生 python 解决方案是什么?你能显示详细信息吗?假设我有 4 个具有这些字段名称的文件: colA colB colC colD colE。另外,我有 1 个具有这些名称的文件: colA colC colE colX.我希望最终结果显示:colA colC colE。所以,colA colC colE 在所有列名集中。
  • smci 之前给您带来的困惑,请见谅。这适用于不同的 CSV 文件。我测试过的其他文件中一定有一些奇怪的东西。非常感谢!!!
【解决方案2】:

取自 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?

【讨论】:

    猜你喜欢
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    相关资源
    最近更新 更多