2017-11-15 2 views
4

I Pandas am Üben und haben folgende Aufgabe:Pythonic Weg über Wörterbuch Schleife

Erstellen Sie eine Liste, deren Elemente die Anzahl der Spalten von jeder .csv


CSV-Dateien Datei gespeichert werden im Wörterbuch directory von Jahr verkeilte

ich benutze ein Wörterbuch Verständnis dataframes (wieder für Jahr verkeilt), um die CSV-Dateien als Pandas Datenrahmen zu speichern

directory = {2009: 'path_to_file/data_2009.csv', ... , 2018: 'path_to_file/data_2018.csv'} 

dataframes = {year: pandas.read_csv(file) for year, file in directory.items()} 

# My Approach 1 
columns = [df.shape[1] for year, df in dataframes.items()] 

# My Approach 2 
columns = [dataframes[year].shape[1] for year in dataframes] 

Welcher Weg ist mehr "Pythonic"? Oder gibt es einen besseren Weg, dies zu erreichen?

+2

Können Sie '[df.shape [1] für df in dataframes.values ​​()]' '? –

+0

@PeterGibson das ist genau das, was ich gesucht habe! Wusste nicht, dass es eine 'dict.values ​​()' Methode gab –

Antwort

4

Ihre Methode wird es schaffen ... aber ich mag es nicht, die gesamte Datei einzulesen und einen Datenrahmen zu erstellen, nur um die Spalten zu zählen. Sie könnten dasselbe tun, indem Sie einfach die erste Zeile jeder Datei lesen und die Anzahl der Kommas zählen. Beachten Sie, dass ich 1 hinzufüge, da es immer ein Komma weniger als Spalten gibt.

columns = [open(f).readline().count(',') + 1 for _, f in directory.items()] 
+0

Coole Lösung! Diese Aufgabe ist jedoch nur ein Teil eines größeren Projekts, bei dem ich die verschiedenen Datenrahmen manipulieren, verschmelzen, grafisch darstellen werde. –

+1

@VivekJha dann ist nichts falsch mit Ihrer Lösung. Ich werde Sie jedoch warnen, wenn Sie andere Dinge mit einem Wörterbuch von Datenframes down-stream machen ... Ich wäre vorsichtig. Wenn Sie in dieser Hinsicht Probleme bekommen und keine Lösung über die Suche finden können, zögern Sie nicht, eine andere Frage zu stellen. – piRSquared

+1

Außerdem sind die anderen Antworten genauso "Pythonic" wie die, die Sie selbst erfunden haben. – piRSquared

3

könnten Sie verwenden:

columns = [len(dataframe.columns) for dataframe in dataframes.values()] 

Wie @piRSquared erwähnt, wenn Ihr einziges Ziel ist es, die Anzahl der Spalten in dem Datenrahmen bekommen Sie nicht die gesamte CSV-Datei lesen sollen, anstatt die nrows verwenden Schlüsselwortargument der Funktion read_csv.

2
import os 
#use this to find files under certain dir, you can filter it if there are other files 
target_files = os.listdir('path_to_file/')  
columns = list() 
for filename in train_files: 
    #in your scenario @piRSquared's answer would be more efficient. 
    columns.append(#column_numbers) 

Wenn Sie Spalten mit dem Schlüssel für Jahr aus dem Dateinamen möchten, können Sie die Dateinamen und Update-Wörterbuch wie folgt filtern:

year = filename.replace(r'[^0-9]', '') 
4

Ihren Ansatz 2:

columns = [dataframes[year].shape[1] for year in dataframes] 

ist mehr Pythonic und prägnant mit der zukünftigen Verwendung von Datenrahmen beim Zusammenführen, Plotten, Manipulieren usw. Da die Schlüssel im Verständnis und der Form enthalten sind, gibt die Anzahl der Spalten

an
Verwandte Themen