2016-05-10 10 views
0

Ich möchte Spalten in einem Pandas' DataFrame zu einem, unter bestimmten Bedingungen aggregieren. Die Idee besteht darin, Speicherplatz in einem DF zu sparen und einige der Spalten zu einem einzigen zusammenzufassen, sofern sie eine bestimmte Bedingung erfüllen. Ein Beispiel wäre es wahrscheinlich einfacher zu erklären:Pandas: Wie aggregiere ich * einige * der * Spalten * in einem Pandas 'DataFrame

import pandas as pd 
import seaborn as sns  # for sample data set 

# load some sample data 
titanic = sns.load_dataset('titanic') 

# round the age to an integer for convenience 
titanic['age_round'] = titanic['age'].round(0) 

# crosstabulate 
crtb = pd.crosstab(titanic['embark_town'], titanic['age_round'], margins=True) 
crtb 

ergibt:

enter image description here

Was ich tun möchte, ist zum Beispiel alle Spalten zu aggregieren, die> = 20 (zum Beispiel), zu einer Spalte mit dem Namen '20 + 'und die Werte wären die Summe aller Werte pro Zeile für die aggregierten Spalten. Wenn die Spaltenüberschriften < 20 sind, bleiben sie getrennt und unberührt. Eine Möglichkeit besteht darin, eine weitere Spalte im ursprünglichen DF zu erstellen, die den ursprünglichen Wert von age_rounded angibt, wenn es < 20 und '20 + 'ist, oder verwenden Sie .cut und pivotieren Sie darauf.

Fragen, ob es eine Möglichkeit gibt, es schlauer zu machen und ohne eine neue Spalte zu erstellen. Danke!

Antwort

0

Für dieses spezifische Beispiel, ich glaube nicht, müssen Sie eine Spalte hinzufügen, aktualisieren Sie einfach die Werte in der Spalte, die Sie bereits haben:

import pandas as pd 
import seaborn as sns  # for sample data set 

# load some sample data 
titanic = sns.load_dataset('titanic') 

# round the age to an integer for convenience 
titanic['age_round'] = titanic['age'].round(0) 
titanic.loc[titanic['age_round']>=20, 'age_round'] = '20+' 

# crosstabulate 
crtb = pd.crosstab(titanic['embark_town'], titanic['age_round'], margins=True) 

Ist Ihre Frage, wie dies im Allgemeinen zu tun? Es gibt eine Reihe von verschiedenen Möglichkeiten, um Daten in Pandas zu aggregieren. Der Standard ist die Verwendung der .groupby() - Konstruktion. Kreuztabelle ist im Grunde eine Abkürzung der Gruppierung von diesen beiden Variablen und Aufruf von .unstack().

+0

Danke für die Antwort. Ja, ich suche nach einer allgemeinen Lösung. Diese Lösung, die Sie vorschlagen, ähnelt meiner in dem Sinne, dass sie die tatsächlichen Spaltenwerte modifiziert. Ich hatte gehofft, dass es eine Lösung gibt, die auf die Spaltenüberschriften angewendet werden kann (die anschließend eine Aggregationsfunktion auf die tatsächlichen Werte anwenden). – Optimesh

+0

Das würde nicht viel Sinn machen - Ihre Werte werden zu Ihren Spaltenüberschriften. Wenn Sie warten, bis sie die Header sind, haben Sie nur noch mehr zu tun. – flyingmeatball

Verwandte Themen