【问题标题】:Pythonic way to copy a column from a CSV file从 CSV 文件复制列的 Pythonic 方法
【发布时间】:2013-01-26 19:13:45
【问题描述】:

我正在寻找一种 Pythonic 简洁的方法来选择 .csv 文件中的列并将该列的所有单元格存储在例如列表中。

import csv    

with open("/path/to/file.csv","r") as csvfile:
    reader = csv.DictReader(csvfile, delimiter=";")
    # TODO: select column for key "foo"
    # TODO: select column for key "bar"
    # TODO:store "foo" data in list
    # TODO: store "bar" data in list

【问题讨论】:

  • 除了循环reader 并仅通过列名挑选出每一列之外,还有什么? for row in reader: print row['foo']?
  • @MartijnPieters 也许这已经在某个地方实现了,以及其他按列操作 CSV 数据的工具。
  • 是的,这就是csv 模块所做的DictReader 是一个可迭代对象,它为每一行生成 dict 对象......这就是为什么你的问题令人费解。
  • @MartijnPieters 对不起,我的意思是写 column-wise

标签: python csv python-3.x import-from-csv


【解决方案1】:
bash-3.2$ cat tcsv.py
import csv
def get_col(filename, col=0):
    for row in csv.reader(open(filename), delimiter=';'):
        yield row[col]
print list(get_col("tar.data"))

bash-3.2$ python tcsv.py
['1.0', '4.7', '4.7']

bash-3.2$ cat tar.data
1.0;2.3;4.5;512
4.7;9.2;6.7;240
4.7;1.8;4.3;912

【讨论】:

    【解决方案2】:

    在纯 Python 中从 DictReader 行字典中获取列很简单,而且其他人现在可能正在写一个关于这种效果的答案,所以我不会重复这种努力,而是在我最喜欢的一个中展示如何做到这一点用于数据操作的 Python 库,pandas

    >>> import pandas as pd
    >>> df = pd.read_csv("somefile.csv", sep=";")
    >>> df
       foo  bar      apple
    0    1  100       pear
    1    2  200     orange
    2    3  300  tangerine
    3    4  400      peach
    >>> df["foo"]
    0    1
    1    2
    2    3
    3    4
    Name: foo
    >>> df["bar"]
    0    100
    1    200
    2    300
    3    400
    Name: bar
    >>> df["foo"] * df["bar"]
    0     100
    1     400
    2     900
    3    1600
    >>> list(df["foo"] * df["bar"])
    [100, 400, 900, 1600]
    

    pandas 之前的黑暗日子里,我有自己的手工制作的库来进行这种数据访问。几年前pandas 大约十五分钟后,我把它扔了..

    【讨论】:

    • 我非常喜欢 Pandas,但添加另一个依赖项并不总是最受欢迎的解决方案。话虽如此,如果 OP 打算做更多的数据分析,使用 Pandas 可能会省去很多麻烦。
    • 我确实打算做更多的数据分析,我过去使用过 R,所以 Pandas 可能是唯一的解决方案。
    【解决方案3】:

    如果您想分别访问文件中的每一列,最有效的方法是遍历csv一次收集列数据:

    import defaultdict
    import csv
    
    columns = defaultdict(list)
    
    with open("/path/to/file.csv","r") as csvfile:
        reader = csv.DictReader(csvfile, delimiter=";")
        for row in reader:
            for key, value in row.iteritems():
                defaultdict[key] = value
    

    现在columns 是一个字典,每列都有一个列表:

    for value in columns['foo']:
        # do something with the `foo` column
    # etc.
    

    【讨论】:

      【解决方案4】:
      import csv
      
      def col_selector(table, column_key):
          return [row[column_key] for row in table]
      
      with open("/path/to/file.csv","r") as csvfile:
          reader = csv.DictReader(csvfile, delimiter=";")
          table = [row for row in reader]
          foo_col = col_selector(table, "foo")
          bar_col = col_selector(table, "bar")
      

      这是一种在单独的函数中使用列表推导式的简单方法。当然,您可以更花哨一点,并使用实现 __getitem__ 来制作表格对象(就像 Pandas 的答案一样),但这似乎适合您的目的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-29
        • 2011-01-16
        • 1970-01-01
        • 2016-10-21
        • 1970-01-01
        • 2012-11-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多