好的,所以我想要反转一个带有一些重复的表格:
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
答案 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]