2013-01-09 156 views
9
Dataframe: 
    one two 
a 1 x 
b 1 y 
c 2 y 
d 2 z 
e 3 z 

grp = DataFrame.groupby('one') 
grp.agg(lambda x: ???) #or equivalent function 

所需的输出从grp.agg:蟒蛇大熊猫定制AGG功能

one two 
1 x|y 
2 y|z 
3 z 

我的积分dataframes前AGG功能是"|".join(sorted(set(x)))。理想情况下,我希望组中有任意数量的列,并且为上述两个列项目返回"|".join(sorted(set())。我也试过np.char.join()

爱熊猫,它已经把我从800线复杂的程序,到400线在公园放大。谢谢:)

回答

10

你是如此接近:

In [1]: df.groupby('one').agg(lambda x: "|".join(x.tolist())) 
Out[1]: 
    two 
one 
1 x|y 
2 y|z 
3  z 

扩展答案排序处理,并采取只设定:

In [1]: df = DataFrame({'one':[1,1,2,2,3], 'two':list('xyyzz'), 'three':list('eecba')}, index=list('abcde'), columns=['one','two','three']) 

In [2]: df 
Out[2]: 
    one two three 
a 1 x  e 
b 1 y  e 
c 2 y  c 
d 2 z  b 
e 3 z  a 

In [3]: df.groupby('one').agg(lambda x: "|".join(x.order().unique().tolist())) 
Out[3]: 
    two three 
one 
1 x|y  e 
2 y|z b|c 
3  z  a 
+0

太棒了。我正在骇人听闻的'grp2.agg(lambda x:u“|”.join(sorted(set(map(str,x.tolist())))))'。感谢您向我展示使用阵列的真实性!哪里有很好的参考?再次感谢。 –

+0

老实说,Ipython和代码片段的试验比我的理解做得比任何一个资源都多。但是Wes McKinney的Python for Data Analysis是一个很好的参考。 – Zelazny7

+0

自12月以来,我一直在阅读这本书,但仍有很多需要练习。仅供参考我看了一些HDF5商店的问题,我遇到了同样的灵活性问题。我使用了300万行数据集,包含60列,大量文本,并且MongoDB一直是冠军。 –

1

有一种更好的方法来连接字符串,在大熊猫documentation
所以我更喜欢这种方式:

In [1]: df.groupby('one').agg(lambda x: x.str.cat(sep='|')) 
Out[1]: 
    two 
one 
1 x|y 
2 y|z 
3  z