Pandas: divisez dataframe en plusieurs dataframes par le nombre de lignes

assez nouveau pour les pandas alors sois indulgente avec moi...

j'ai un énorme csv avec beaucoup de tables avec beaucoup de rangées. Je voudrais simplement diviser chaque dataframe en 2 si elle contient plus de 10 lignes.

si vrai, je voudrais que la première datagramme contienne les 10 premiers et le reste dans la seconde datagramme.

Est-il une fonction pratique? J'ai regardé mais rien trouvé d'utile...

c'est à dire split_dataframe(df, 2(si > 10))?

18
demandé sur Boosted_d16 2014-08-13 19:53:35

5 réponses

cela retournera les images de données fractionnées si la condition est remplie, sinon retournez l'original et None (que vous devez alors gérer séparément). Notez que cela suppose que le fractionnement ne doit se produire qu'une seule fois par df et que la deuxième partie de la séparation (si elle est plus longue que 10 lignes (ce qui signifie que l'original était plus long que 20 lignes)) est OK.

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

notez que vous pouvez aussi utiliser df.head(10) et df.tail(len(df) - 10) pour obtenir de l'avant et à l'arrière selon vos besoins. Vous pouvez également utiliser différentes approches d'indexation: vous pouvez simplement fournir l'index des premières dimensions si vous voulez, comme df[:10] au lieu de df[:10, :] (bien que j'aime code explicitement sur les dimensions que vous prenez). Vous pouvez également utiliser df.iloc et df.ix à indexer de la même façon.

attention à ne pas utiliser df.loc toutefois, depuis il est basé sur l'étiquette et l'input ne sera jamais interprété comme une position entière. .loc ne fonctionne "accidentellement" dans le cas où il se trouve que vous avez des étiquettes d'index qui sont des entiers commençant à 0 avec aucune discontinuité.

mais vous devriez également considérer les différentes options que pandas prévoit pour le dumping du contenu de la base de données en HTML et peut-être aussi LaTeX pour faire des tables mieux conçues pour la présentation (au lieu de simplement copier et coller). Il suffit de googler comment convertir le DataFrame à ces formats révèle beaucoup de tutoriels et de conseils pour exactement cette application.

13
répondu ely 2016-10-25 17:26:34

Il n'y a aucune fonction de commodité.

Vous avez à faire quelque chose comme:

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
répondu EdChum 2014-08-13 16:02:27

Vous pouvez utiliser les méthodes tête et queue de DataFrame comme sucre syntaxique au lieu de trancher/loc ici. J'utilise un split de 3; pour votre exemple utilisez 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
répondu Tom Walker 2017-09-18 12:25:50

si vous avez un grand cadre de données et avez besoin de diviser en un nombre variable de sous-cadres de données, comme par exemple chaque sous-cadre de données a un maximum de 4500 lignes, ce script pourrait aider:

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

vous pouvez alors sauvegarder ces cadres de données:

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

Espérons que cela aide quelqu'un!

0
répondu cheevahagadog 2017-11-02 20:10:45

Une méthode basée sur 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)]

une petite fonction qui utilise un modulo pourrait prendre en charge les cas où la division n'est pas égale (par exemple np.split(df.index,4) renvoie une erreur).

( Oui, je sais que la question initiale était un peu plus précise que celle-ci. Toutefois, ceci est supposé répondre à la question du titre.)

0
répondu webelo 2018-02-23 14:50:54