Python-pandas groupby:如何获得字符串的并集

我有一个这样的数据框:

   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 !

Calling

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

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 默认情况下串联

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

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}

以上是 Python-pandas groupby:如何获得字符串的并集 的全部内容, 来源链接: utcz.com/qa/427744.html

回到顶部