Как сгруппировать несколько столбцов и объединить данные в пандах - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть кадр данных pandas с несколькими столбцами (words, start time, stop time, speaker):

  • Я хочу объединить все значения в столбце word, в то время как значения в столбце data не изменяютсяИЛИ значения в столбце meta_data не меняются.
  • Кроме того, я хочу сохранить значение start для первого слова и значение stop для последнего слова в комбинации.

В настоящее время у меня есть:

      word  start  stop     data    meta_data  
0      but   2.72  2.85        2      9
1   that's   2.85  3.09        2      9
2  alright   3.09  3.47        2      1
3    we'll   8.43  8.69        1      4
4     have   8.69  8.97        1      4
5       to   8.97  9.07        1      4
6     okay   9.19 10.01        2      2
7     sure  10.02 11.01        2      1
8    what?  11.02 12.00        1      4

Однако я хотел бы превратить это в:

       word       start  start  data  meta_data
0  but that's      2.72   3.09     2    9
1  alright         3.09   3.47     2    1
2  we'll have to   8.43   9.07     1    4
3  okay            9.19  10.01     2    2
4  sure            10.02 11.01     2    1
5  what?           11.02 12.00     1    4

Ответы [ 2 ]

3 голосов
/ 08 ноября 2019

Для этого нужно создать ключ справки, тогда мы shift + cumsum создадим ключ группы на основе этого

df['Key']=df[['data','meta_data']].apply(tuple,1)
d={'word':' '.join,'start':'min','stop':'max','data':'first','meta_data':'first'}
df.groupby(df.Key.ne(df.Key.shift()).cumsum()).agg(d).reset_index(drop=True)
Out[171]: 
            word  start   stop  data  meta_data
0     but that's   2.72   3.09     2          9
1        alright   3.09   3.47     2          1
2  we'll have to   8.43   9.07     1          4
3           okay   9.19  10.01     2          2
4           sure  10.02  11.01     2          1
5          what?  11.02  12.00     1          4
2 голосов
/ 08 ноября 2019

здесь делаем математику + GroupBy.agg

s=df['data']+df['meta_data']
groups=s.ne(s.shift()).cumsum()
new_df=( df.groupby(groups)
           .agg({'word':' '.join,'start':'min',
                 'stop':'max','data':'first',
                 'meta_data':'first'}) )
print(new_df)

            word  start   stop  data  meta_data
1     but that's   2.72   3.09     2          9
2        alright   3.09   3.47     2          1
3  we'll have to   8.43   9.07     1          4
4           okay   9.19  10.01     2          2
5           sure  10.02  11.01     2          1
6          what?  11.02  12.00     1          4

, если вы думаете, что сумма может соответствовать в двух разных и последовательных группах, которые выможет использовать несколько более сложную функцию с десятичными числами

p=(df['data']+0.1723).pow(df['meta_data']+2.017)
groups=p.ne(p.shift()).cumsum()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...