【问题标题】:How to select unique values from named column in multiple .csv files?如何从多个 .csv 文件中的命名列中选择唯一值?
【发布时间】: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 包。如果您仍然在使用它,请查看发布的其他与您尝试的方法类似的方法。

标签: python pandas loops csv dataframe


【解决方案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())
      
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-04
        • 1970-01-01
        • 1970-01-01
        • 2014-07-14
        • 2012-01-24
        • 1970-01-01
        • 2012-03-28
        相关资源
        最近更新 更多