2016-07-11 3 views
2

Ich habe eine Datei mit mehreren Datensätzen, die durch Zeilen getrennt sind. Es sieht so etwas wie:Wie verwende ich Pandas, um mehrere Datensätze aus einer Datei einzulesen?

country1 
0.9 
1.3 
2.9 
1.1 
... 
country2 
4.1 
3.1 
0.2 
... 

Ich mag würde Pandas verwenden, um die gesamte Datei in mehrere Datenrahmen zu lesen, wobei jeder Datenrahmen in ein Land entspricht. Gibt es einen einfachen Weg, dies zu tun? Jedes Land hat eine unterschiedliche Anzahl von Einträgen.

Antwort

5

Sie können mask von to_numeric mit errors='coerce' erstellen, also erhalten Sie NaN wo Spaltennamen sind. finden sie dann von isnull und erstellen Sie Gruppen von cumsum:

import pandas as pd 
import io 

temp=u"""country1 
0.9 
1.3 
2.9 
1.1 
country2 
4.1 
3.1 
0.2""" 
#after testing replace io.StringIO(temp) to filename 
df = pd.read_csv(io.StringIO(temp), index_col=None, header=None) 
print (df) 
      0 
0 country1 
1  0.9 
2  1.3 
3  2.9 
4  1.1 
5 country2 
6  4.1 
7  3.1 
8  0.2 
mask = pd.to_numeric(df.iloc[:,0], errors='coerce').isnull().cumsum() 
print (mask) 
0 1 
1 1 
2 1 
3 1 
4 1 
5 2 
6 2 
7 2 
8 2 
Name: 0, dtype: int32 

Letzte Verwendung list comprehension für die Liste der dataframes:

dfs = [g[1:].rename(columns={0:g.iloc[0].values[0]}) for i, g in df.groupby(mask)] 

print (dfs) 

print (dfs[0]) 
    country1 
1  0.9 
2  1.3 
3  2.9 
4  1.1 

print (dfs[1]) 
    country2 
6  4.1 
7  3.1 
8  0.2 

Wenn Bedarf reset index:

dfs = [g[1:].rename(columns={0:g.iloc[0].values[0]}).reset_index(drop=True) for i, g in df.groupby(mask)] 

print (dfs) 

print (dfs[0]) 
    country1 
0  0.9 
1  1.3 
2  2.9 
3  1.1 
print (dfs[1]) 
    country2 
0  4.1 
1  3.1 
2  0.2 
+1

@ArturJ diese Lösung sollte unabhängig davon, ob die Länder numerisch geordnet arbeiten. Jezrael benutzt 'is_numeric', um diejenigen Einträge zu identifizieren, die ** nicht ** numerisch sind, damit er identifizieren kann, wo Subdatenrahmen enden und beginnen. Dies wird nur dann ein Problem darstellen, wenn die Daten selbst nicht numerisch sind oder wenn das Land "5.3" heißt. Unterm Strich solltest du gut gehen. – piRSquared

+1

@ArturJ auch, wenn dies Ihre Frage beantwortet, denken Sie bitte daran, es als die Antwort zu markieren. Wenn Sie eine Follow-up-Frage haben, zögern Sie nicht, eine andere Frage zu stellen. – piRSquared

1

Pandas unterstützt Standard-Dateiformate wie CSV und JSON, und das ist keiner von denen. Ich gehe davon aus, dass das Neuformatieren der Datei von Hand Zeitverschwendung ist, und schlagen vor, dass Sie die Datei selbst mit with open(...) as f: und f.readlines() in Python-Objekte analysieren.

Sagen Sie das getan haben, und das Format aussieht data, dann from_dict() funktionieren sollte:

data = { "countryName1": [0.9, 1.3, ...], "countryName2": [...]} 
df = pd.DataFrame.from_dict(data) 
Verwandte Themen