如何从多个 .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 文件中的列表收集的唯一名称值的类的多个对象