我有一个这样的数据框:
A B C 0 1 0.749065 This 1 2 0.301084 is 2 3 0.463468 a 3 4 0.643961 random 4 1 0.866521 string 5 2 0.120737 !
呼唤
In [10]: print df.groupby("A")["B"].sum()
将返回
A 1 1.615586 2 0.421821 3 0.463468 4 0.643961
现在,我想对列“ C”执行“相同”操作。因为该列包含字符串,所以sum()不起作用(尽管您可能认为它将字符串连接在一起)。我真正想看到的是每个组的字符串列表或一组字符串,即
A 1 {This, string} 2 {is, !} 3 {a} 4 {random}
我一直在尝试找到方法来做到这一点。
尽管Series.unique()(http://pandas.pydata.org/pandas- docs/stable/genic/pandas.Series.unique.html)无效,但是
df.groupby("A")["B"]
是一个
pandas.core.groupby.SeriesGroupBy object
所以我希望任何Series方法都可以。有任何想法吗?
In [4]: df = read_csv(StringIO(data),sep='\s+') In [5]: df Out[5]: A B C 0 1 0.749065 This 1 2 0.301084 is 2 3 0.463468 a 3 4 0.643961 random 4 1 0.866521 string 5 2 0.120737 ! In [6]: df.dtypes Out[6]: A int64 B float64 C object dtype: object
应用自己的函数时,不会自动排除非数字列。这会慢一些,但比应用.sum()到groupby
.sum()
groupby
In [8]: df.groupby('A').apply(lambda x: x.sum()) Out[8]: A B C A 1 2 1.615586 Thisstring 2 4 0.421821 is! 3 3 0.463468 a 4 4 0.643961 random
sum 默认情况下串联
sum
In [9]: df.groupby('A')['C'].apply(lambda x: x.sum()) Out[9]: A 1 Thisstring 2 is! 3 a 4 random dtype: object
你几乎可以做你想做的
In [11]: df.groupby('A')['C'].apply(lambda x: "{%s}" % ', '.join(x)) Out[11]: A 1 {This, string} 2 {is, !} 3 {a} 4 {random} dtype: object
在整个框架上一次执行一次。关键是要返回一个Series
Series
def f(x): return Series(dict(A = x['A'].sum(), B = x['B'].sum(), C = "{%s}" % ', '.join(x['C']))) In [14]: df.groupby('A').apply(f) Out[14]: A B C A 1 2 1.615586 {This, string} 2 4 0.421821 {is, !} 3 3 0.463468 {a} 4 4 0.643961 {random}