it-swarm.com.de

Pandas: Datenframe nach Zeilenanzahl in mehrere Datenframes aufteilen

recht neu für Pandas, so ertrage mich mit ...

Ich habe eine riesige CSV mit vielen Tabellen mit vielen Zeilen. Ich möchte jeden Datenrahmen einfach in 2 aufteilen, wenn er mehr als 10 Zeilen enthält. 

Wenn ja, möchte ich, dass der erste Datenrahmen die ersten 10 und der Rest im zweiten Datenrahmen enthält. 

Gibt es dafür eine bequeme Funktion? Ich habe mich umgesehen, aber nichts Nützliches gefunden ... 

d. h. split_dataframe (df, 2 (wenn> 10))? 

21
Boosted_d16

Dadurch werden die aufgeteilten DataFrames zurückgegeben, wenn die Bedingung erfüllt ist. Andernfalls werden Original und None (die Sie dann separat behandeln müssten) zurückgegeben. Beachten Sie, dass dies davon ausgeht, dass die Aufteilung nur einmal pro df erfolgen muss und dass der zweite Teil der Aufteilung (wenn er länger als 10 Zeilen ist (was bedeutet, dass das Original länger als 20 Zeilen war)) OK ist.

df_new1, df_new2 = df[:10, :], df[10:, :] if len(df) > 10 else df, None

Hinweis: Sie können auch df.head(10) und df.tail(len(df) - 10) verwenden, um die Vorder- und Rückseite Ihren Bedürfnissen entsprechend zu erhalten. Sie können auch verschiedene Indizierungsmethoden verwenden: Sie können einfach den ersten Dimensionsindex angeben, wenn Sie möchten, wie df[:10] anstelle von df[:10, :] (obwohl ich gerne explizit über die von Ihnen verwendeten Dimensionen kodiere). Sie können auch df.iloc und df.ix verwenden, um auf ähnliche Weise zu indexieren.

Seien Sie jedoch vorsichtig mit df.loc, da es Label-basiert ist und die Eingabe niemals als Ganzzahl interpretiert wird. .loc würde nur "versehentlich" funktionieren, wenn Indexnamen vorhanden sind, bei denen es sich um Ganzzahlen handelt, die bei 0 beginnen und keine Lücken aufweisen.

Sie sollten jedoch auch die verschiedenen Optionen in Betracht ziehen, die Pandas für das Ausgeben des Inhalts des DataFrame in HTML und möglicherweise auch für LaTeX bieten, um besser entworfene Tabellen für die Präsentation zu erstellen (anstatt nur zu kopieren und einzufügen). Durch einfaches Googlen, wie Sie den DataFrame in diese Formate konvertieren, werden viele Tutorials und Ratschläge für genau diese Anwendung angezeigt.

15
ely

Es gibt keine spezielle Komfortfunktion.

Sie müssten etwas tun wie:

first_ten = pd.DataFrame()
rest = pd.DataFrame()

if df.shape[0] > 10: # len(df) > 10 would also work
    first_ten = df[:10]
    rest = df[10:]
12
EdChum

Nachfolgend finden Sie eine einfache Funktionsimplementierung, die einen DataFrame in Chunks und einige Codebeispiele aufteilt:

import pandas as pd

def split_dataframe_to_chunks(df, n):
    df_len = len(df)
    count = 0
    dfs = []

    while True:
        if count > df_len-1:
            break

        start = count
        count += n
        #print("%s : %s" % (start, count))
        dfs.append(df.iloc[start : count])
    return dfs


# Create a DataFrame with 10 rows
df = pd.DataFrame([i for i in range(10)])

# Split the DataFrame to chunks of maximum size 2
split_df_to_chunks_of_2 = split_dataframe_to_chunks(df, 2)
print([len(i) for i in split_df_to_chunks_of_2])
# prints: [2, 2, 2, 2, 2]

# Split the DataFrame to chunks of maximum size 3
split_df_to_chunks_of_3 = split_dataframe_to_chunks(df, 3)
print([len(i) for i in split_df_to_chunks_of_3])
# prints [3, 3, 3, 1]
1
Roei Bahumi

Ich habe diese List Comprehensions verwendet, um eine riesige Datenbank in 100'000-Blöcke zu schneiden:

size = 100000
list_of_dfs = [df.loc[i:i+size-1,:] for i in range(0, len(df),size)]

oder als Generator:

list_of_dfs = (df.loc[i:i+size-1,:] for i in range(0, len(df),size))
1
agittarius

Sie können die DataFrame-Methoden head und tail anstelle von Slicing/Loc als syntaktischen Zucker verwenden. Ich verwende eine Splitgröße von 3; Verwenden Sie für Ihr Beispiel headSize = 10

def split(df, headSize) :
    hd = df.head(headSize)
    tl = df.tail(len(df)-headSize)
    return hd, tl

df = pd.DataFrame({    'A':[2,4,6,8,10,2,4,6,8,10],
                       'B':[10,-10,0,20,-10,10,-10,0,20,-10],
                       'C':[4,12,8,0,0,4,12,8,0,0],
                      'D':[9,10,0,1,3,np.nan,np.nan,np.nan,np.nan,np.nan]})

# Split dataframe into top 3 rows (first) and the rest (second)
first, second = split(df, 3)
1
Tom Walker

Wenn Sie einen großen Datenrahmen haben und in eine variable Anzahl von Sub-Datenrahmenzeilen unterteilen müssen, z. B. jeder Sub-Datenrahmen maximal 4500 Zeilen hat, kann dieses Skript Folgendes unterstützen:

max_rows = 4500
dataframes = []
while len(df) > max_rows:
    top = df[:max_rows]
    dataframes.append(top)
    df = df[max_rows:]
else:
    dataframes.append(df)

Sie können dann diese Datenrahmen speichern:

for _, frame in enumerate(dataframes):
    frame.to_csv(str(_)+'.csv', index=False)

Hoffe das hilft jemandem!

0
cheevahagadog

Eine Methode basierend auf np.split:

df = pd.DataFrame({    'A':[2,4,6,8,10,2,4,6,8,10],
                       'B':[10,-10,0,20,-10,10,-10,0,20,-10],
                       'C':[4,12,8,0,0,4,12,8,0,0],
                      'D':[9,10,0,1,3,np.nan,np.nan,np.nan,np.nan,np.nan]})

listOfDfs = [df.loc[idx] for idx in np.split(df.index,5)]

Eine kleine Funktion, die ein Modulo verwendet, kann für Fälle sorgen, in denen die Aufteilung nicht gleichmäßig ist (z. B. np.split(df.index,4) gibt einen Fehler aus).

( Ja, mir ist bewusst, dass die ursprüngliche Frage etwas konkreter war als diese. Dies soll jedoch die Frage im Titel beantworten. )

0
webelo

Die auf Listenverständnis und groupby basierende Methode, die alle aufgeteilten Datenframes in einer Listenvariablen speichert und über den Index zugänglich ist.

Beispiel:

ans = [pd.DataFrame(y) for x, y in DF.groupby('column_name', as_index=False)]***
ans[0]
ans[0].column_name
0
Ram Prajapati