2012-11-06 30 views
15

Z DataFrame poniżej jako przykład,Pandy: Tworzenie zbiorczy kolumnę w DataFrame

In [83]: 
df = pd.DataFrame({'A':[1,1,2,2],'B':[1,2,1,2],'values':np.arange(10,30,5)}) 
df 
Out[83]: 
    A B values 
0 1 1  10 
1 1 2  15 
2 2 1  20 
3 2 2  25 

Jaki byłby to prosty sposób, aby wygenerować nową kolumnę zawierającą pewną agregację danych nad jedną z kolumn?

Na przykład, jeżeli suma values nad elementami w A

In [84]: 
df.groupby('A').sum()['values'] 
Out[84]: 
A 
1 25 
2 45 
Name: values 

Jak mogę uzyskać

A B values sum_values_A 
0 1 1  10   25 
1 1 2  15   25 
2 2 1  20   45 
3 2 2  25   45 

Odpowiedz

20
In [20]: df = pd.DataFrame({'A':[1,1,2,2],'B':[1,2,1,2],'values':np.arange(10,30,5)}) 

In [21]: df 
Out[21]: 
    A B values 
0 1 1  10 
1 1 2  15 
2 2 1  20 
3 2 2  25 

In [22]: df['sum_values_A'] = df.groupby('A')['values'].transform(np.sum) 

In [23]: df 
Out[23]: 
    A B values sum_values_A 
0 1 1  10   25 
1 1 2  15   25 
2 2 1  20   45 
3 2 2  25   45 
+0

Świetnie! Wiedziałem, że musi być jeden liniowiec. Dzięki. – foglerit

3

znalazłem sposób przy użyciu join:

In [101]: 
aggregated = df.groupby('A').sum()['values'] 
aggregated.name = 'sum_values_A' 
df.join(aggregated,on='A') 

Out[101]: 
    A B values sum_values_A 
0 1 1  10   25 
1 1 2  15   25 
2 2 1  20   45 
3 2 2  25   45 

ktoś ma prostszy sposób to zrobić?

3

To nie jest tak bezpośredni, ale uważam, że to bardzo intuicyjny (wykorzystanie mapie, aby utworzyć nowe kolumny z innej kolumny) i może być stosowany do wielu innych przypadkach:

gb = df.groupby('A').sum()['values'] 

def getvalue(x): 
    return gb[x] 

df['sum'] = df['A'].map(getvalue) 
df 
+0

Dzięki , metoda mapy wydaje się dość potężna. Na pewno z niego skorzystam często. – foglerit

2
In [15]: def sum_col(df, col, new_col): 
    ....:  df[new_col] = df[col].sum() 
    ....:  return df 

In [16]: df.groupby("A").apply(sum_col, 'values', 'sum_values_A') 
Out[16]: 
    A B values sum_values_A 
0 1 1  10   25 
1 1 2  15   25 
2 2 1  20   45 
3 2 2  25   45 
Powiązane problemy