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

时间:2016-09-13 19:28:25

标签: python pandas numpy

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

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

因此,当我调用agg函数时,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 个答案:

答案 0 :(得分:4)

您正在使用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,则数字列为omited

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

如果meanstring列被省略:

print (df.groupby('Id').mean())
        SUB_ID
Id            
276956    5934
287266    1589

更常见的是使用函数apply - 请参阅flexible 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

答案 1 :(得分:3)

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,) 将是相关分组的数据框,您可以对其执行通常对数据框执行的任何操作,例如

WebClient wc = new WebClient();
wc.Proxy = null;
wc.UseDefaultCredentials = true;
string xml = wc.DownloadString(url);
XDocument doc = XDocument.Parse(xml);
MessageBox.Show(doc.FirstNode + "");