2017-05-01 4 views
1

Ich habe einen Datenrahmen, den ich verwende pandas.groupby für eine bestimmte Spalte und dann aggregierte Statistiken für die produzierten Gruppen (Mittelwert, Median , Anzahl). Ich möchte bestimmte Spaltenwerte als Mitglieder derselben Gruppe behandeln, die von der Gruppe erzeugt werden, und nicht eine eindeutige Gruppe pro eindeutigem Wert in der Spalte, die für die Gruppierung verwendet wurde. Ich habe geschaut, wie ich so etwas erreichen würde.Pandas: Verwenden von Gruppe durch, kombinieren mehrere Spaltenwerte als eine eigenständige Gruppe innerhalb der Gruppe von

Zum Beispiel:

>> my_df 
ID SUB_NUM  ELAPSED_TIME 
1  1   1.7 
2  2   1.4 
3  2   2.1 
4  4   3.0 
5  6   1.8 
6  6   1.2 

Anstatt also das typische Verhalten:

>> my_df.groupby([SUB_NUM]).agg([count]) 
ID SUB_NUM  Count 
1  1   1 
2  2   2 
4  4   1 
5  6   2 

Ich möchte bestimmte Werte (SUB_NUM in [1, 2]) als eine Gruppe berechnet werden, so dass anstelle etwas wie unten ist produziert:

>> # Some mystery pandas function calls 
ID SUB_NUM  Count 
1  1, 2  3 
4  4   1 
5  6   2 

Jede Hilfe wäre sehr geschätzt, danke!

+0

meinst du wie http://stackoverflow.com/questions/17679089/pandas-dataframe-groupby-two-columns-and- bekommen-zählt? – SGhaleb

Antwort

3

Für mich funktioniert:

#for join values convert values to string 
df['SUB_NUM'] = df['SUB_NUM'].astype(str) 
#create mapping dict by dict comprehension 
L = ['1','2'] 
d = {x: ','.join(L) for x in L} 
print (d) 
{'2': '1,2', '1': '1,2'} 

#replace values by dict 
a = df['SUB_NUM'].replace(d) 
print (a) 
0 1,2 
1 1,2 
2 1,2 
3  4 
4  6 
5  6 
Name: SUB_NUM, dtype: object 


#groupby by mapping column and aggregating `first` and `size` 
print (df.groupby(a) 
     .agg({'ID':'first', 'ELAPSED_TIME':'size'}) 
     .rename(columns={'ELAPSED_TIME':'Count'}) 
     .reset_index()) 

    SUB_NUM ID Count 
0  1,2 1  3 
1  4 4  1 
2  6 5  2 

What is the difference between size and count in pandas?

0

Sie können eine weitere Spalte erstellen, die die Werte SUB_NUM den tatsächlichen Gruppen zuordnet und dann nach ihnen gruppiert.

my_df['SUB_GROUP'] = my_df['SUB_NUM'].apply(lambda x: 1 if x < 3 else x) 
my_df.groupby(['SUB_GROUP']).agg([count])