熊猫:传递给agg函数的对象的数据类型是什么

Fiz*_*izi 2 python numpy pandas

我很好奇到底传递给agg函数的是什么

Id      NAME   SUB_ID
276956  A      5933
276956  B      5934
276956  C      5935
287266  D      1589
Run Code Online (Sandbox Code Playgroud)

因此,当我调用agg函数时,x的数据类型到底是什么。

df.groupby('Id').agg(lambda x: set(x))
Run Code Online (Sandbox Code Playgroud)

从我自己的挖掘中,我发现x是,<type 'property'>但我不知道它到底是什么。我正在尝试将任何特定组的记录压缩到一行中。因此,对于ID 276956,我想在“名称”列下的一个单元格中包含A,B,C。我一直在通过将其转换为集合来执行此操作,但它使我对Nan和None值感到不满。我想知道在一行中进行压缩的最佳方法是什么。如果这些是numpy数组,那么我真的不需要转换,但是类似

df.groupby('Id').agg(lambda x: x)
Run Code Online (Sandbox Code Playgroud)

引发错误

jez*_*ael 5

您正在使用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
Run Code Online (Sandbox Code Playgroud)

您可以使用自定义函数,但是必须汇总输出:

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}     
Run Code Online (Sandbox Code Playgroud)

如果需要聚集join,则省略数字列:

print (df.groupby('Id').agg(', '.join))
           NAME
Id             
276956  A, B, C
287266        D
Run Code Online (Sandbox Code Playgroud)

如果meanstring则忽略列:

print (df.groupby('Id').mean())
        SUB_ID
Id            
276956    5934
287266    1589
Run Code Online (Sandbox Code Playgroud)

比较常用的功能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
Run Code Online (Sandbox Code Playgroud)