Veja o DataFrame:
import pandas as pd
import numpy as np
data=pd.DataFrame(['random 15 numbers 128 and 12 letters','12-5','page 65'],columns=['text'])
Quero extrair todos os números das strings e escrever o número máximo em uma nova coluna. Consegui isso com este código:
data['list']=data['text'].str.extractall('(\d+)').unstack().values.tolist()
data['max']=data['list'].apply(lambda row:max([int(x) for x in row if x is not np.nan]))
Isso resulta neste DataFrame:
Primeira pergunta: existe uma maneira mais elegante de fazer isso?
Meu problema real: meu código funciona apenas se não houver NaN
valor no meu DataFrame original. Como você adaptaria o código nesse caso? O resultado deve ser uma NaN
coluna para cada NaN
valor com o índice correto. Substitua a data
linha de definição pelo seguinte para fazer o problema aparecer:
data=pd.DataFrame(['random 15 numbers 128 and 12 letters','12-5','page 65',np.nan],columns=['text'])
Além disso, quero lidar com o código com entradas que não são NaN
senão strings sem número. Nesse caso, a lista intermediária deve estar vazia e a última linha deve estar NaN
(esta última coisa é fácil de conseguir manipulando a última linha).
Não use uma lista como intermediária, vá diretamente com
groupby.max
:Saída:
Se você precisar da lista e do máximo:
Saída: