私はCSVファイルを解析し、特定の列からのみデータを抽出しようとしています。
Csvの例:
ID | Name | Address | City | State | Zip | Phone | OPEID | IPEDS |
10 | C... | 130 W.. | Mo.. | AL... | 3.. | 334.. | 01023 | 10063 |
ID
、Name
、Zip
、Phone
のように、特定の列だけをキャプチャしようとしています。
私が見たコードは、対応する番号で特定の列を呼び出すことができると信じさせてくれました。つまり、Name
は2
に対応し、row[2]
を使用して各行を繰り返すと列2のすべての項目が生成されます。 t。
これが私がこれまでにやったことです:
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
そして、これは各行に必要な特定の列だけを出力することを期待していますが、そうでない場合は最後の列のみを取得します。
このコードから最後の列を取得する唯一の方法は、printステートメントを含めない場合です。 in your for
ループ。
これはおそらくあなたのコードの終わりです。
for row in reader:
content = list(row[i] for i in included_cols)
print content
あなたはそれがこれであることを望みます:
for row in reader:
content = list(row[i] for i in included_cols)
print content
私たちはあなたの間違いをカバーしましたので、 pandas モジュールを紹介するためにこの時間をかけたいと思います。
Pandasはcsvファイルを扱うのに壮観です、そして、以下のコードはあなたがcsvを読んで、そして変数に列全体を保存するのに必要なすべてです。
import pandas as pd
df = pd.read_csv(csv_file)
saved_column = df.column_name #you can also use df['column_name']
そのため、Names
カラムのすべての情報を変数に保存したい場合は、これで十分です。
names = df.Names
それは素晴らしいモジュールです、そして私はあなたがそれを検討することを勧めます。何らかの理由であなたのprintステートメントがfor
ループに入っていて、それがまだ最後のコラムを出力しているだけであったとしても、それは起こらないはずですが、私の仮定が間違っていたかどうか私に知らせてください。投稿されたコードにはたくさんの字下げエラーがあるので、何がどこにあるべきかを知るのは困難でした。これが役に立ったことを願っています!
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=" ")
pandas を使用すると、 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
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')
コンテキスト:この種の作業には、すばらしいpython petlライブラリを使用してください。標準のcsvモジュールを使って手動で作業することによる多くの作業とフラストレーションの節約になります。私の知る限り、まだcsvモジュールを使用しているのは、表形式のデータ(パンダ、petlなど)を操作するための優れたツールをまだ発見していない人だけです。 petlのような何かを学ぶことは、さまざまな奇妙な情報源からのあなたのキャリアがあなたができる最も良い投資の一つです。 pip install petlを実行してから作業を始めるのに30分しかかかりません。ドキュメントは優れています。
回答:csvファイルに最初のテーブルがあるとしましょう(petlを使ってデータベースから直接読み込むこともできます)。それからあなたはそれを単にロードして次のことをするでしょう。
from petl import fromcsv, look, cut, tocsv
#Load the table
table1 = fromcsv('table1.csv')
# Alter the colums
table2 = cut(table1, 'Song_Name','Artist_ID')
#have a quick look to make sure things are ok. Prints a nicely formatted table to your console
print look(table2)
# Save to new file
tocsv(table2, 'new.csv')
import pandas as pd
csv_file = pd.read_csv("file.csv")
column_val_list = csv_file.column_name._ndarray_values
列名 を取得するには、 readlines() を使用するのではなく、 readline() を使用してループ全体を読み、ファイル全体を読み、配列に格納します。
with open(csv_file, 'rb') as csvfile:
# get number of columns
line = csvfile.readline()
first_item = line.split(',')
列を別々に処理する必要がある場合は、Zip(*iterable)
パターンを使用して列を分解します(事実上「解凍」)。だからあなたの例では:
ids, names, zips, phones = Zip(*(
(row[1], row[2], row[6], row[7])
for row in reader
))
パンダデータフレームをインデックス付けしてサブセット化できる方法のおかげで、csvファイルから単一の列を変数に抽出する非常に簡単な方法は、次のとおりです。
myVar = pd.read_csv('YourPath', sep = ",")['ColumnName']
考慮すべき点がいくつかあります。
上記のスニペットはSeries
ではなくdataframe
というパンダを生成します。速度が問題である場合は、usecols
を指定したayhanからの提案も速くなります。 2122 KBサイズのcsvファイルで%timeit
を使用して2つの異なるアプローチをテストすると、usecolsアプローチでは22.8 ms
が、私が提案するアプローチでは53 ms
が生成されます。
そしてimport pandas as pd
を忘れないで