2016-03-23 14 views
1

我正在嘗試對某些信號進行分組並將它們連接在一起,以便我使用類似於以下代碼的內容。當我使用sum_x自定義函數來連接下的「文」的文字groupby在帶文本的列中使用時返回多級數據幀

lst = [{'name': 'A', 'reg': '1', 'text': 'txt1', 'value': 5}, 
{'name': 'A', 'reg': '1', 'text': 'txt2', 'value': 2}, 
{'name': 'B', 'reg': '2', 'text': 'txt3', 'value': 2}] 
data = pd.DataFrame(lst) 
sum_x = lambda x : x.sum() 
data.groupby(by=['name', 'reg']).apply(sum_x) 

Out[48]: 
     name reg  text value 
name reg       
A 1  AA 11 txt1txt2  7 
B 2  B 2  txt3  2 

然而,這不會產生預期的結果 注意如何預期加入文本列,但也是「被」列進行級聯。答案也有一個額外的水平。 是更多鈔票,以獲得類似:

name reg  text value  
A 1  txt1txt2  7 
B 2   txt3  2 

其中「通過」中的列被保留嗎?

回答

2

試這個:

In [21]: data.groupby(['name', 'reg']).agg({'value':'sum', 'text':'sum'}).reset_index() 
Out[21]: 
    name reg  text value 
0 A 1 txt1txt2  7 
1 B 2  txt3  2 
2

您可以選擇列groupby操作適用於:

In [21]: data.groupby(by=['name', 'reg'])[['text', 'value']].apply(sum_x) 
Out[21]: 
       text value 
name reg 
A 1 txt1txt2  7 
B 2  txt3  2 

最後,如果你不希望在指數namereg,則可以使用reset_index()

In [22]: data.groupby(by=['name', 'reg'])[['text', 'value']].apply(sum_x).reset_index() 
Out[22]: 
    name reg  text value 
0 A 1 txt1txt2  7 
1 B 2  txt3  2