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
@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
@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