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】:您可以将extract
与regex
模式一起使用
df.groupby(df['a'].str.extract('(^[^_]*)')[0])['b'].sum()
输出:
0
x 3
y 3
Name: b, dtype: int64
【讨论】:
以上是关于Pandas 按子字符串或正则表达式分组的主要内容,如果未能解决你的问题,请参考以下文章
15.python正则匹配 元字符转义重复或捕获分组断言:零度断言负向零宽断言贪婪非贪婪引擎选项