Pandas 按子字符串或正则表达式分组

Posted

技术标签:

【中文标题】Pandas 按子字符串或正则表达式分组【英文标题】:Pandas groubpy on substring or regex 【发布时间】: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'])

【问题讨论】:

【参考方案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

【讨论】:

以上是关于Pandas 按子字符串或正则表达式分组的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式匹配逗号不在分组符号之间

15.python正则匹配 元字符转义重复或捕获分组断言:零度断言负向零宽断言贪婪非贪婪引擎选项

JS正则表达式从入门到入土—— 分组

Python 正则表达式 利用括号分组

pandas extractall() 没有提取给定正则表达式的所有案例?

手机号码的通用正则表达式?