J'essaye de travailler avec Pandas et j'ai besoin d'une solution pour le problème suivant.

J'ai un ensemble de données avec des colonnes qui ressemblent à ceci:

X1 Y1 Z1 1.....(bunch of other columns)
X1 Y1 Z1 2.....(bunch of other columns)
X1 Y1 Z1 3.....(bunch of other columns)
X2 Y2 Z2 1.....(bunch of other columns)
X2 Y2 Z2 2.....(bunch of other columns)
X2 Y2 Z2 3.....(bunch of other columns)
X2 Y2 Z2 4.....(bunch of other columns)

Je dois traiter l'ensemble de données en considérant les trois premières colonnes comme la clé. Je dois donc d'abord considérer toutes les lignes associées à X1 Y1 Z1, traiter un tas de colonnes dans celle-ci, puis passer au bloc suivant X2 Y2 Z2. Alors d'abord c'est

X1 Y1 Z1 1.....(bunch of other columns)
X1 Y1 Z1 2.....(bunch of other columns)
X1 Y1 Z1 3.....(bunch of other columns) 

Suivi par

X2 Y2 Z2 1.....(bunch of other columns)
X2 Y2 Z2 2.....(bunch of other columns)
X2 Y2 Z2 3.....(bunch of other columns)
X2 Y2 Z2 4.....(bunch of other columns)

Je recherche une solution dans pandas ou numpy pour traiter cet ensemble de données. Et je gère des millions de lignes, donc les pandas iterrows() seraient lents.

1
lalith kkvn 23 juil. 2015 à 03:25

2 réponses

Meilleure réponse

Si vos données sont chargées dans un DataFrame df avec les colonnes X, Y, Z, col1, col2 ...., alors vous pouvez boucler sur les 'groupes' / 'morceaux' des données comme ci-dessous:

for concat_XYZ, df_group in df.groupby(df['X']+df['Y']+df['Z']):
    # process df_group
    # ....

Chaque df_group est un morceau (ou un DataFrame en soi) comme vous le souhaitez dans votre question. La concaténation des chaînes dans les colonnes X, Y et Z est utilisée pour identifier de manière unique un groupe.

1
vk1011 23 juil. 2015 à 20:46

Si votre traitement est identique mais que vous avez besoin de les séparer par groupes, alors écrivez votre fonction et utilisez groupby.apply() il renverra le dataframe après avoir appliqué votre fonction par groupe.

def do_stuff(DataFrame):
    DataFrame['stuff'] = DataFrame['col1'] + DataFrame['col2'] + DataFrame['col3']
    return DataFrame

new_df = original_df.groupby(['col1', 'col2', 'col3'], as_index=False).apply(do_stuff)    
1
user2734178 23 juil. 2015 à 00:49