Pandas:agg函数传递的对象数据类型是什么?

3

我一直很好奇传递给agg函数的确切内容是什么

Id      NAME   SUB_ID
276956  A      5933
276956  B      5934
276956  C      5935
287266  D      1589

当我调用聚合函数时,x 的数据类型是什么?
df.groupby('Id').agg(lambda x: set(x))

我自己查询发现x是<type 'property'>,但我不明白它到底是什么。我想要做的是将任何特定组的记录压缩到一行中。所以对于id 276956,我想要在Name列下有一个单元格包含A、B、C。我一直在使用集合来达到这个目的,但它会导致NaN和None值出现问题。我想知道最佳的压缩单行的方法。如果这些是numpy数组,那么我就不需要转换,但类似这样的方式

df.groupby('Id').agg(lambda x: x)

抛出错误

2个回答

6
你正在使用 Series 进行操作:
print (df.groupby('Id').agg(lambda x: print(x)))
0    A
1    B
2    C
Name: NAME, dtype: object
3    D
Name: NAME, dtype: object
0    5933
1    5934
2    5935
Name: SUB_ID, dtype: int64
3    1589
Name: SUB_ID, dtype: int64

您可以使用自定义函数,但输出必须进行聚合:

def f(x):
    print (x)
    return set(x)

print (df.groupby('Id').agg(f))
             NAME              SUB_ID
Id                                   
276956  {C, B, A}  {5933, 5934, 5935}
287266        {D}              {1589}     

如果需要聚合join,数值列会被省略:详见链接

print (df.groupby('Id').agg(', '.join))
           NAME
Id             
276956  A, B, C
287266        D

如果省略了mean和string列:
print (df.groupby('Id').mean())
        SUB_ID
Id            
276956    5934
287266    1589

更常用的是使用函数apply - 参见灵活应用

def f(x):
    print (x)
    return ', '.join(x)

print (df.groupby('Id')['NAME'].apply(f))
Id
276956    A, B, C
287266          D
Name: NAME, dtype: object

很高兴能帮助你。请不要忘记“接受”我的或其他人的答案。谢谢。 - jezrael

4
>>> df[['Id', 'NAME']].groupby('Id').agg(lambda x: ', '.join(x))
           NAME
Id             
276956  A, B, C
287266        D

在这种情况下,x 将是每个相关分组的系列 Id
要实际获取值列表:
>>> df[['Id', 'NAME']].groupby('Id').agg(lambda x: x.values.tolist())
             NAME
Id               
276956  [A, B, C]
287266        [D]

更一般地说,x将是一个与分组相关的数据框,您可以对其执行任何您通常可以使用数据框进行的操作,例如:
>>> df.groupby('Id').agg(lambda x: x.shape)
        NAME SUB_ID
Id                 
276956  (3,)   (3,)
287266  (1,)   (1,)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接