潘达斯对子串或重构码的处理方法

问题描述 投票:0回答:1

给定一个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'])
pandas python-2.7 pandas-groupby
1个回答
3
投票

就像这样。

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

另一种不用复杂的regex的方法

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
© www.soinside.com 2019 - 2024. All rights reserved.