使用pandas groupby()。transform()和tolist()作为聚合器

时间:2017-02-19 13:09:44

标签: python pandas

好的,所以我想要反转一个带有一些重复的表格: ATC hierarchy Drug Group 0 A Alimentary tract and metabolism 1 A01 STOMATOLOGICAL PREPARATIONS 2 A01A STOMATOLOGICAL PREPARATIONS 3 A01AA Caries prophylactic agents 4 A01AB Antiinfectives and antiseptics for local oral ...

得到这样的东西:

Drug Group allatcs 0 Alimentary tract and metabolism ['A'] 1 STOMATOLOGICAL PREPARATIONS ['A01', 'A01A'] 3 Caries prophylactic agents ['A01AA'] 4 Antiinfectives and antiseptics for local oral ... ['A01AB']

所以,自然的方式是groupby()和transform(),而不是使用' sum'或者作为教程示例的平均值,对组值的系列值使用tolist():

atcd_['allatcs'] = atcd_.groupby('Drug Group')['ATC hierarchy'].\
                          transform(lambda ser: ser.tolist())

但是,唉,它并没有产生预期的聚合: ATC hierarchy Drug Group allatcs 0 A Alimentary tract and metabolism A 1 A01 STOMATOLOGICAL PREPARATIONS A01 2 A01A STOMATOLOGICAL PREPARATIONS A01A 3 A01AA Caries prophylactic agents A01AA 4 A01AB Antiinfectives and antiseptics for local oral ... A01AB

2 个答案:

答案 0 :(得分:0)

我对变换及其使用方式不太了解,所以我不确定为什么这样做不起作用,但是你想要做的事情可以通过.agg()轻松完成。

atcd_.groupby('Drug Group')['ATC hierarchy'].agg(lambda ser: list(ser))

以您想要的格式返回一个系列。

答案 1 :(得分:0)

好的,所以'转换'期望一个函数在一个Series(代表一个Group)上运行,并返回标量或一个与一系列相同长度的向量。然后结果是"广播"在组的所有行上,这意味着(A)如果输出是标量(B)"压缩"则将标量值放在所有行上。如果组的向量元素是一个向量,则逐行向量。

文档有点误导,解释了矢量大小写: "...Thus, the passed transform function should return a result that is the same size as the group chunk..." 但是在所有例子中使用简单的标量情况(例如......变换(' sum'))

现在,如果它是一个矢量,那就是"广播"到它所操作的组的所有行。

所以,我应该做的是返回一个标量,这是一个非常小的变化:

atcd_['allatcs'] = atcd_.groupby('Drug Group')['ATC hierarchy'].\
                       transform(lambda ser: [ser.tolist()])

现在可以通过以下方式实现所需的结果:

atcd_.drop('ATC hierarchy', axis=1).drop_duplicates(subset='Drug Group')

Out[257]: Drug Group allatcs 0 Alimentary tract and metabolism [A] 1 STOMATOLOGICAL PREPARATIONS [A01, A01A] 3 Caries prophylactic agents [A01AA] 4 Antiinfectives and antiseptics for local oral ... [A01AB]