我一直很好奇传递给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)
抛出错误
答案 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
如果mean
,string
列被省略:
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 + "");