Pandas groubpy для подстроки или регулярного выражения - PullRequest
2 голосов
/ 04 мая 2020

Учитывая pandas фрейм данных. Как я могу выполнить группировку в столбце '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'])

Ответы [ 2 ]

3 голосов
/ 04 мая 2020

Примерно так:

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

Вы можете выполнить 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 голосов
/ 05 мая 2020

Вы можете использовать extract с шаблоном regex

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

Вывод:

0
x    3
y    3
Name: b, dtype: int64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...