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)
引发错误
您正在使用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)
如果mean,string则忽略列:
print (df.groupby('Id').mean())
SUB_ID
Id
276956 5934
287266 1589
Run Code Online (Sandbox Code Playgroud)
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)