Próbuję przeanalizować plik csv i wyodrębnić dane tylko z określonych kolumn.
Przykład CSV:
ID | Name | Address | City | State | Zip | Phone | OPEID | IPEDS |
10 | C... | 130 W.. | Mo.. | AL... | 3.. | 334.. | 01023 | 10063 |
Staram się uchwycić tylko konkretne kolumny, powiedzmy ID
, Name
, Zip
i Phone
.
Kod, na który patrzyłem, doprowadził mnie do przekonania, że mogę wywołać określoną kolumnę za pomocą odpowiadającego jej numeru, więc np .: Name
będzie odpowiadać 2
i iterowanie przez każdy wiersz przy użyciu row[2]
spowoduje wyświetlenie wszystkich elementów w kolumnie 2. Tylko tak nie jest.
Oto, co zrobiłem do tej pory:
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
i spodziewam się, że to wydrukuje tylko określone kolumny, które chcę dla każdego wiersza, z wyjątkiem tego, że nie, otrzymuję tylko ostatnią kolumnę.
'rb'
flagaopen()
? czy nie powinno to być proster
?"rb"
jest odpowiednie do przekazaniacsv.reader
.Odpowiedzi:
Jedynym sposobem, by być coraz ostatnią kolumnę z tym kodem jest, jeśli nie zawierają swoje oświadczenie druku w swojej
for
pętli.To najprawdopodobniej koniec twojego kodu:
Chcesz, żeby tak było:
Skoro już omówiliśmy Twój błąd, chciałbym poświęcić ten czas na wprowadzenie do modułu pandy .
Pandy są spektakularne do radzenia sobie z plikami csv, a poniższy kod wystarczy, aby odczytać plik csv i zapisać całą kolumnę w zmiennej:
więc jeśli chcesz zapisać wszystkie informacje w swojej kolumnie
Names
w zmiennej, to wszystko, co musisz zrobić:To świetny moduł i sugeruję, żebyś się z nim zapoznał. Jeśli z jakiegoś powodu twoja instrukcja print była
for
zapętlona i nadal drukowała tylko ostatnią kolumnę, co nie powinno się zdarzyć, ale daj mi znać, jeśli moje założenie było błędne. Twój opublikowany kod zawiera wiele błędów związanych z wcięciami, więc trudno było wiedzieć, co powinno być gdzie. Mam nadzieję, że to było pomocne!źródło
Z plikiem takim jak
Wyjdzie
Lub alternatywnie, jeśli chcesz numeryczne indeksowanie kolumn:
Aby zmienić separator, dodaj
delimiter=" "
do odpowiedniej instancji, tjreader = csv.reader(f,delimiter=" ")
źródło
Użyj pand :
Odrzuć niepotrzebne kolumny w czasie analizy:
PS Po prostu podsumowuję to, co powiedzieli inni w prosty sposób. Rzeczywiste odpowiedzi pochodzą stąd i tutaj .
źródło
Z pandy można skorzystać
read_csv
zusecols
parametru:Przykład:
źródło
Możesz użyć
numpy.loadtext(filename)
. Na przykład, jeśli to jest Twoja baza danych.csv
:I chcesz
Name
kolumny:Łatwiej możesz użyć
genfromtext
:źródło
Kontekst: Do tego typu pracy powinieneś używać niesamowitej biblioteki Python petl. Pozwoli Ci to zaoszczędzić wiele pracy i potencjalnej frustracji związanej z robieniem rzeczy „ręcznie” za pomocą standardowego modułu csv. AFAIK, jedynymi osobami, które nadal korzystają z modułu csv są ci, którzy nie odkryli jeszcze lepszych narzędzi do pracy z danymi tabelarycznymi (pandy, petl itp.), Co jest w porządku, ale jeśli planujesz pracować z dużą ilością danych w Twoja kariera z różnych dziwnych źródeł, nauka czegoś takiego jak petl jest jedną z najlepszych inwestycji, jakie możesz poczynić. Rozpoczęcie powinno zająć tylko 30 minut po zakończeniu instalacji pip petl. Dokumentacja jest doskonała.
Odpowiedź: Załóżmy, że masz pierwszą tabelę w pliku csv (możesz również załadować ją bezpośrednio z bazy danych za pomocą petla). Następnie po prostu załaduj go i wykonaj następujące czynności.
źródło
Myślę, że jest łatwiejszy sposób
Więc tutaj
iloc[:, 0]
,:
oznacza wszystkie wartości,0
oznacza pozycję kolumny. w poniższym przykładzieID
zostaną wybraneźródło
źródło
pip install pandas
pierwszyDzięki sposobowi indeksowania i podzbioru ramki danych pandy, bardzo łatwym sposobem wyodrębnienia pojedynczej kolumny z pliku csv do zmiennej jest:
Kilka kwestii do rozważenia:
Powyższy fragment utworzy pandy,
Series
a niedataframe
. Sugestia od ayhan zusecols
będzie również szybsza, jeśli problemem jest prędkość. Testowanie dwóch różnych podejść przy użyciu%timeit
pliku csv o rozmiarze 2122 KB daje wyniki22.8 ms
dla metody usecols i53 ms
dla mojego sugerowanego podejścia.I nie zapomnij
import pandas as pd
źródło
Jeśli potrzebujesz przetworzyć kolumny osobno, lubię niszczyć kolumny za pomocą
zip(*iterable)
wzorca (efektywnie „rozpakuj”). Na przykład:źródło
Aby pobrać nazwę kolumny , zamiast używać readlines (), lepiej użyj readline (), aby uniknąć zapętlenia i odczytu całego pliku i przechowywania go w tablicy.
źródło