199

csv ファイルを解析して、特定の列のみからデータを抽出しようとしています。

csv の例:

ID | Name | Address | City | State | Zip | Phone | OPEID | IPEDS |
10 | C... | 130 W.. | Mo.. | AL... | 3.. | 334.. | 01023 | 10063 |

、、、などの特定の列のみをキャプチャしようとしIDNameZipますPhone

私が見たコードは、対応する番号で特定の列を呼び出すことができると私に信じさせNameまし2row[2].

これまでに行ったことは次のとおりです。

import sys, argparse, csv
from settings import *

# command arguments
parser = argparse.ArgumentParser(description='csv to postgres',\
 fromfile_prefix_chars="@" )
parser.add_argument('file', help='csv file to import', action='store')
args = parser.parse_args()
csv_file = args.file

# open csv file
with open(csv_file, 'rb') as csvfile:

    # get number of columns
    for line in csvfile.readlines():
        array = line.split(',')
        first_item = array[0]

    num_columns = len(array)
    csvfile.seek(0)

    reader = csv.reader(csvfile, delimiter=' ')
        included_cols = [1, 2, 6, 7]

    for row in reader:
            content = list(row[i] for i in included_cols)
            print content

そして、これが各行に必要な特定の列のみを出力することを期待していますが、そうではありません。最後の列のみを取得します。

4

13 に答える 13

120
import csv
from collections import defaultdict

columns = defaultdict(list) # each value in each column is appended to a list

with open('file.txt') as f:
    reader = csv.DictReader(f) # read rows into a dictionary format
    for row in reader: # read a row as {column1: value1, column2: value2,...}
        for (k,v) in row.items(): # go over each column name and value 
            columns[k].append(v) # append the value into the appropriate list
                                 # based on column name k

print(columns['name'])
print(columns['phone'])
print(columns['street'])

のようなファイルで

name,phone,street
Bob,0893,32 Silly
James,000,400 McHilly
Smithers,4442,23 Looped St.

出力します

>>> 
['Bob', 'James', 'Smithers']
['0893', '000', '4442']
['32 Silly', '400 McHilly', '23 Looped St.']

または、列の数値インデックスが必要な場合は、次のようにします。

with open('file.txt') as f:
    reader = csv.reader(f)
    reader.next()
    for row in reader:
        for (i,v) in enumerate(row):
            columns[i].append(v)
print(columns[0])

>>> 
['Bob', 'James', 'Smithers']

区切り記号を変更するには、適切なインスタンス化に追加delimiter=" "します。つまり、reader = csv.reader(f,delimiter=" ")

于 2013-05-12T02:34:02.697 に答える
32

パンダを使う:

import pandas as pd
my_csv = pd.read_csv(filename)
column = my_csv.column_name
# you can also use my_csv['column_name']

解析時に不要な列を破棄します。

my_filtered_csv = pd.read_csv(filename, usecols=['col1', 'col3', 'col7'])

PS私は他の人が言ったことを簡単な方法で集約しているだけです. 実際の回答はhereおよびhereから取得されます。

于 2017-05-23T09:05:23.440 に答える
21

使用できますnumpy.loadtext(filename)。たとえば、これがデータベースの場合.csv:

ID | Name | Address | City | State | Zip | Phone | OPEID | IPEDS |
10 | Adam | 130 W.. | Mo.. | AL... | 3.. | 334.. | 01023 | 10063 |
10 | Carl | 130 W.. | Mo.. | AL... | 3.. | 334.. | 01023 | 10063 |
10 | Adolf | 130 W.. | Mo.. | AL... | 3.. | 334.. | 01023 | 10063 |
10 | Den | 130 W.. | Mo.. | AL... | 3.. | 334.. | 01023 | 10063 |

そして、あなたはName列が欲しい:

import numpy as np 
b=np.loadtxt(r'filepath\name.csv',dtype=str,delimiter='|',skiprows=1,usecols=(1,))

>>> b
array([' Adam ', ' Carl ', ' Adolf ', ' Den '], 
      dtype='|S7')

より簡単に使用できますgenfromtext

b = np.genfromtxt(r'filepath\name.csv', delimiter='|', names=True,dtype=None)
>>> b['Name']
array([' Adam ', ' Carl ', ' Adolf ', ' Den '], 
      dtype='|S7')
于 2014-01-10T13:46:04.563 に答える
19

パンダではread_csv、パラメータで使用できusecolsます:

df = pd.read_csv(filename, usecols=['col1', 'col3', 'col7'])

例:

import pandas as pd
import io

s = '''
total_bill,tip,sex,smoker,day,time,size
16.99,1.01,Female,No,Sun,Dinner,2
10.34,1.66,Male,No,Sun,Dinner,3
21.01,3.5,Male,No,Sun,Dinner,3
'''

df = pd.read_csv(io.StringIO(s), usecols=['total_bill', 'day', 'size'])
print(df)

   total_bill  day  size
0       16.99  Sun     2
1       10.34  Sun     3
2       21.01  Sun     3
于 2016-12-06T20:26:01.350 に答える
1

pandas データフレームをインデックス化してサブセット化できる方法のおかげで、csv ファイルから単一の列を変数に抽出する非常に簡単な方法は次のとおりです。

myVar = pd.read_csv('YourPath', sep = ",")['ColumnName']

考慮すべき点がいくつかあります。

上記のスニペットは pandas を生成しSeriesdataframe. 速度が問題になる場合は、ayhan からの提案usecolsも高速になります。%timeit2122 KB サイズの csv ファイルを使用して 2 つの異なるアプローチをテストする22.8 msと、usecols アプローチと53 ms私が提案するアプローチが得られます。

忘れないでimport pandas as pd

于 2018-12-10T08:33:55.727 に答える