如何从多个 .csv 文件中的命名列中选择唯一值?

Posted

技术标签:

【中文标题】如何从多个 .csv 文件中的命名列中选择唯一值?【英文标题】:How to select unique values from named column in multiple .csv files? 【发布时间】:2019-09-09 00:10:22 【问题描述】:

我正在尝试从多个 csv 创建一个唯一 ID 列表。

我有大约 80 个包含数据的 csv,它们都采用相同的格式并位于同一目录中。这些文件包含来自大约 1500 个站点的时间序列数据,但并非所有站点都在所有文件中。包含我需要的数据的列称为'Site Id'。 我可以通过创建dataframe 从第一个 csv 中获取唯一值,但我看不到如何遍历所有剩余的文件。

如果现在还不明显的话,我是一个完整的初学者,我的导师正在休假!

我尝试为单个文件创建df,但我不知道下一步。

df = pd.read_csv(r'C:filepathhere.csv')
ids = df['Site Id'].unique().tolist()

【问题讨论】:

您需要这个的最终格式是什么?列表? 感谢您的提问。我认为列表是最好的选择。我计划使用该列表作为按站点拆分每个 csv 的基础,因此我将拥有 1500 个各个站点的所有数据文件,而不是所有站点的 80 个每月数据文件。 知道了,如果您不需要已经或以后使用它,我会回答避免使用更重的 Pandas 包。如果您仍然在使用它,请查看发布的其他与您尝试的方法类似的方法。 【参考方案1】:

您可以这样做来遍历所有 CSV 并将它们加载到数据帧中:

from os import walk, path
import pandas as pd

path = 'Path to CSV dir'

csv_paths = []
for root, dirs, files in walk(path):
    for c in glob(path.join(root, '*.csv')):
        csv_paths.append(c)


for file_path in csv_paths:
    df = pd.read_csv(filepath_or_buffer=file_path)
    # do something with df (append, export, etc.) 

【讨论】:

【参考方案2】:

你可以做这样的事情。我使用os.listdir 函数获取所有文件,然后使用list.extend 将我遇到的站点ID 合并到我的siteIDs 列表中。最后,将列表转换为集合,然后再转换回列表将删除所有重复条目。

siteIDs = []
directoryToCSVs = r'c:\...'

for filename in os.listdir(directoryToCSVs):
    if filename.lower().endswith('.csv'):
         df = pd.read_csv(r'C:filepathhere.csv')
         siteIDs.extend( df['Site Id'].tolist() )

#remove duplicate site IDs
siteIDs = list(set(siteIds))


#siteIDs will now contain a list of the unique site IDs across all of your CSV files.

【讨论】:

【参考方案3】:

首先,您需要将文件收集到一个列表中,以便从中获取数据。有很多方法可以做到这一点,假设您知道它们所在的目录see this answer for many options。

from os import walk

f = []
for (dirpath, dirnames, filenames) in walk(mypath):
    f.extend(filenames)
    break

然后,您需要在该列表中收集您需要的那些唯一值。不使用 Pandas,因为看起来您实际上并不需要数据框中的信息:

import csv

unique_data = 
for file in f:
    with open(file, 'rU') as infile:
        reader = csv.DictReader(infile)
        for row in reader:
            # go through each, add value to dictionary
            for header, value in row.items():
                unique_data[value] = 0

# unqiue_data.keys() is now your list of unique values, if you want a true list
unique_data_list = list(unqiue_data.keys())


【讨论】:

以上是关于如何从多个 .csv 文件中的命名列中选择唯一值?的主要内容,如果未能解决你的问题,请参考以下文章

如何创建具有从 csv 文件中的列表收集的唯一名称值的类的多个对象

如何从python中的CSV文件中的列中选择一个随机值?

SQL-当连接不涵盖它们时,如何添加与ID直接对应的命名列

如何从 CSV 更改 AD 中的多个电话号码

如何从加载在 sql/plsql 表中的 csv 文件中获取值

如何从数据库中读取值,例如 jmeter 中的 csv 文件