2016-07-13 9 views
0

Ich habe einen Pandas-Datenrahmen mit 40 Spalten und 400000 Zeilen. Ich habe einen zusammengerollten Datensatz in 3 Spalten erstellt.Arithmetische Operation auf einer Gruppe von Pandas Datenrahmen

Jetzt muss ich eine% Metrik basierend auf zwei der Spalten berechnen. Python wirft einen Fehler -

unsupported operand type(s) for /: 'SeriesGroupBy' and 'SeriesGroupBy' 

hier ist der Beispielcode:

print sample_data 
    date part receipt bad_dollars total_dollars bad_percent 
0  1 123  22   40   100   NaN 
1  2 456  44   80   120   NaN 
2  3 134  33   30   150   NaN 
3  1 123  22   80   100   NaN 
4  5 456  45   40    90   NaN 
5  3 134  33   85   150   NaN 
6  7 123  24   70   120   NaN 
7  5 456  45   20    85   NaN 
8  9 134  35   50   300   NaN 
9  7 123  24   300   600   NaN 

sample_data_group = sample_data.groupby(['date','part','receipt']) 

sample_data_group['bad_percents']=sample_data_group['bad_dollars']/sample_data_group['total_dollars'] 

TypeError: unsupported operand type(s) for /: 'SeriesGroupBy' and 'SeriesGroupBy' 

Bitte um Hilfe!

+0

Ihr Code erzeugt keine Spalten „schlecht“ oder „total“ bezeichnet, so ist es nicht sinnvoll, zu versuchen, zu beziehen Sie. Bitte zeigen Sie ein echtes, lauffähiges, in sich abgeschlossenes Beispiel, das das Problem demonstriert. – BrenBarn

Antwort

0

können Sie tun dies auf dem groupby Objekt anwenden werden:

import pandas as pd 
import numpy as np 

cols = ['index', 'date', 'part', 'receipt', 'bad_dollars', 'total_dollars', 'bad_percent'] 
sample_data = pd.DataFrame([[0,  1, 123,  22,   40,   100,   np.nan], 
[1,  2, 456,  44,   80,   120,   np.nan], 
[2,  3, 134,  33,   30,   150,   np.nan], 
[3,  1, 123,  22,   80,   100,   np.nan], 
[4,  5, 456,  45,   40,    90,   np.nan], 
[5,  3, 134,  33,   85,   150,   np.nan], 
[6,  7, 123,  24,   70,   120,   np.nan], 
[7,  5, 456,  45,   20,    85,   np.nan], 
[8,  9, 134,  35,   50,   300,   np.nan], 
[9,  7, 123,  24,   300,   600,   np.nan]], columns = cols).set_index('index', drop = True) 

sample_data_group = sample_data.groupby(['date','part','receipt']) 

xx = sample_data_group.apply(lambda x: x.assign(bad_percent = x.bad_dollars/x.total_dollars))\ 
         .reset_index(['date','part', 'receipt'], drop = True)