2017-10-06 5 views
1

Je cherche à consolider plusieurs lignes de dtypes différents chez les pandas. J'ai mon .groupby() paramètre: ['ID']. La colonne ['A'] peut répéter des valeurs si elle est groupée par ['ID'], ou différera dans les données pour chaque ligne. La colonne ['B'] doit simplement être agrégée via .sum().Grouper des lignes et définir des règles d'agrégation de colonnes

input_df 

ID  A  B 
140-1 Apple  3.2 
140-1 Pear  5.0 
143-2 Plum  1.2 
143-2 Plum  2.0 

Qu'est-ce qu'un excellent moyen de 1) groupe par ['ID'], 2) la valeur d'affichage de ['A'] si elle est répétée après regroupement, première valeur de ['A'] sinon répété après le regroupement, et 3) la colonne de somme ['B'] dans une nouvelle trame de données ?

output_df 

ID  A  B 
140-1 Apple  8.2 
143-2 Plum  3.2 

Répondre

1

Vous pouvez essayer

df.groupby('ID').agg({'A': lambda x: x.unique()[0], 'B': 'sum'}).reset_index() 

    ID  A  B 
0 140-1 Apple 8.2 
1 143-2 Plum 3.2 
+0

Votre code ressemble à cela fonctionnerait sur tout autre dataframe. Pour une raison quelconque, je lance le 'TypeError: les objets' Series 'sont mutables, donc ils ne peuvent pas être hachés' sur mes données réelles. – ParalysisByAnalysis

+0

Pouvez-vous essayer à la place? df.groupby ('ID'). agg ({'A': 'premier', 'B': 'sum'}). reset_index() – Vaishali

+0

Je l'ai compris ... la manière dont j'appelais les colonnes était incorrect. Merci de votre aide! – ParalysisByAnalysis

1

Essayez:

input_df.groupby('ID').apply(lambda f: pd.DataFrame({'A': f.A.head(1), 'B': f.B.sum()})).reset_index(level=0) 


#  ID  A B 
# 0 140-1 Apple 8.2 
# 2 143-2 Plum 3.2