给定一个pandas数据框,如何在列'a'上做一个groupby,使所有以相同字符串开头的行都被分组。比较部分的结尾是 _
. (所以这里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'])
就像这样。
grp = df.groupby(df['a'].str[:2]) ## groups on first 2-letters of column `a`
你可以做一个 count
在这个groupby上,检查以 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
你可以使用 extract
附带 regex
模式
df.groupby(df['a'].str.extract('(^[^_]*)')[0])['b'].sum()
产出:
0
x 3
y 3
Name: b, dtype: int64