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

发布于 2021-02-02 23:13:47

我有一个这样的数据框:

   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方法都可以。有任何想法吗?

关注者
0
被浏览
83
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。
    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}
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看