簡體   English   中英

Pythonic從CSV文件復制列的方法

[英]Pythonic way to copy a column from a CSV file

我正在尋找一種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

在純Python中直接從DictReader行dicts中獲取列,而其他人現在可能正在寫這個效果的答案,所以我不會重復這些努力,而是在我最喜歡的Python庫之一中展示如何做到這一點。數據操作, 熊貓

>>> 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約十五分鍾后,我把它扔了..

如果你想分別訪問這些文件中的每一列,這將會是最有效地遍歷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.
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
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的回答一樣),但這似乎適用於你的目的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM