【问题标题】:Pandas groubpy on substring or regexPandas 按子字符串或正则表达式分组
【发布时间】:2020-08-19 10:01:33
【问题描述】:

给定一个熊猫数据框。 我如何在“a”列上进行分组,这样所有行都以相同的字符串开始分组在一起。比较部分的结尾是_。 (所以这里 y_s1 和 y_s2 组合在一起,而不是 x_s1)

这是一个最小的例子:

raw_data = {'a': ['y_s2', 'y_s1', 'x_s1'], 'b': [1,2,3]}
df = pd.DataFrame(raw_data, columns = ['a', 'b'])

【问题讨论】:

    标签: pandas python-2.7 dataframe pandas-groupby


    【解决方案1】:

    类似这样的:

    grp = df.groupby(df['a'].str[:2])  ## groups on first 2-letters of column `a`
    

    您可以在此 groupby 上执行 count 并检查以 x_ 开头的行是否分组在一起,以及以 y_ 开头的行是否分组在一起。

    In [1545]: df.groupby(df.a.str[:2]).count()                                                                                                                                                                 
    Out[1545]: 
        a  b
    a       
    x_  1  1
    y_  2  2
    

    在 OP 的评论之后,一个更通用的方法:

    ## Split the string on `_` and create 2 separate columns
    
    In [1572]: df['a1'], df['a2'] = df['a'].str.split('_', 1).str 
    In [1573]: df                                                                                                                                                                                               
    Out[1573]: 
          a  b a1  a2
    0  y_s2  1  y  s2
    1  y_s1  2  y  s1
    2  x_s1  3  x  s1
    
    
    ## Groupby on `a1`(the part before `_`)
    
    In [1577]: df.groupby('a1').count().drop('a2', 1)                                                                                                                                                           
    Out[1577]: 
        a  b
    a1      
    x   1  1
    y   2  2
    

    另一种没有复杂正则表达式的方法;

    In [1601]: df.groupby(df['a'].str.split('_').str[0]).count()                                                                                                                                                
    Out[1601]: 
       a  b
    a      
    x  1  1
    y  2  2
    

    【讨论】:

      【解决方案2】:

      您可以将extractregex 模式一起使用

      df.groupby(df['a'].str.extract('(^[^_]*)')[0])['b'].sum()
      

      输出:

      0
      x    3
      y    3
      Name: b, dtype: int64
      

      【讨论】:

        猜你喜欢
        • 2017-10-25
        • 2021-02-10
        • 2020-09-08
        • 2011-12-20
        • 1970-01-01
        • 2016-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多