2017-11-16 9 views
0

Ich habe einen großen Datenframe, den ich auf leere Zeilen teilen muss.Split Pandas DataFrame auf leere Zeilen

hier ist ein vereinfachtes Beispiel für den Datenrahmen:

A B C 
0 1 0 International 
1 1 1 International 
2 NaN 2 International 
3 1 3 International 
4 1 4 International 
5 8 0 North American 
6 8 1 North American 
7 8 2 North American 
8 8 3 North American 
9 NaN NaN NaN 
10 1 0 Internal 
11 1 1 Internal 
12 6 0 East 
13 6 1 East 
14 6 2 East 
... 

Wie Sie sehen können, Zeile 9 ist leer. Was ich tun muss, ist die Zeilen 0 bis 8 zu nehmen und sie in einen anderen Datenrahmen zu bringen, sowie die Zeilen 10 bis zum nächsten Leerzeichen, damit ich am Ende mehrere Datenrahmen habe. Beachten Sie, wenn ich nach leeren Zeilen suche, muss die ganze Zeile leer sein.

Hier ist der Code, den ich mit Rohlingen finden:

def find_breaks(df): 
    df_breaks = df[(df.loc[:,['A','B','C']].isnull()).any(axis=1)] 
    print(df_breaks.index) 

Dieser Code funktioniert, wenn ich es auf dem vereinfachten DF testen, aber, natürlich, mein wirklicher Datenrahmen viele mehr Spalten als ['A','B','C']

Wie kann ich die nächste leere Zeile finden (oder wie oben, alle leeren Zeilen auf einmal), ohne meine Spaltennamen angeben zu müssen?

Dank

Antwort

1

IIUC verwenden pd.isnull + np.split:

df_list = np.split(df, df[df.isnull().all(1)].index) 

for df in df_list: 
    print(df, '\n') 

    A B    C 
0 1.0 0.0 International 
1 1.0 1.0 International 
2 NaN 2.0 International 
3 1.0 3.0 International 
4 1.0 4.0 International 
5 8.0 0.0 North American 
6 8.0 1.0 North American 
7 8.0 2.0 North American 
8 8.0 3.0 North American 

     A B   C 
9 NaN NaN  NaN 
10 1.0 0.0 Internal 
11 1.0 1.0 Internal 
12 6.0 0.0  East 
13 6.0 1.0  East 
14 6.0 2.0  East 

Zunächst erhalten die Indizes in denen die gesamte Zeile null ist, und dass dann verwenden, um Ihre Datenrahmen in Stücke zu teilen. np.split behandelt Datenrahmen ziemlich gut.

+0

ausgezeichnet, viel weniger verschachtelt als mein Code, danke. –

+1

@LegitStack Plus, Ihr Code hatte _any _... während Sie _all_ benötigten (was sicherstellt, dass alle True sind, nicht nur ein oder zwei). –

Verwandte Themen