Tenho um dataframe parecido com este:
test = pd.DataFrame(
{'onset': [1,3,18,33,35,50],
'duration': [2,15,15,2,15,15],
'type': ['Instr', 'Remember', 'SocTestString', 'Rating', 'SelfTestString', 'XXX']
}
)
Quero criar um novo dataframe de forma que quando type
contiver "TestString",
- duas novas linhas são criadas abaixo dessa linha, de modo que a linha agora seja dividida em três linhas com (por exemplo) SocTestString_1, SocTestString_2, SocTestString_3
- para essas três linhas, altere as colunas de duração para o valor 5
- para essas três linhas, altere também a coluna de início de modo que seja o valor de início da coluna anterior + 5
O dataframe final deve ficar assim:
test_final = pd.DataFrame(
{'onset': [1,3,18,23,28,33,35,40,45,50],
'duration': [2,15,5,5,5,2,5,5,5,15],
'type': ['Instr', 'Remember', 'SocTestString_1', 'SocTestString_2', 'SocTestString_3', 'Rating', 'SelfTestString_1', 'SelfTestString_2', 'SelfTestString_3', 'XXX']
})
Como posso fazer isso?
Você pode usar
str.contains
para identificar as linhas de destino, depoisIndex.repeat
duplicá-las, finalmente a indexação booleana egroupby.cumcount
atualizar as novas linhas:NB. isto pressupõe que o índice original não tenha índices duplicados.
Saída:
Intermediários (sem atualizar as colunas originais e redefinir o índice):