groupby在具有文本的列中使用时返回多级数据帧

时间:2016-03-23 21:40:43

标签: python pandas

我正在尝试对一些信号进行分组并同时连接文本,因为我使用了与下面代码类似的东西。我使用sum_x自定义函数连接文本'

下的文本
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

然而,这不会产生预期的结果 请注意文本列是如何按预期添加的,但也是' by'连接的列。响应也有额外的水平。 是否可以获得类似的东西:

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

其中的列是' by'被保留了吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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