Tenho um dataframe pandas onde um valor às vezes obtém NA. Quero preencher esta coluna com uma lista de strings com o mesmo comprimento de outra coluna:
import pandas as pd
import numpy as np
df = pd.DataFrame({"a": ["one", "two"],
"b": ["three", "four"],
"c": [[1, 2], [3, 4]],
"d": [[5, 6], np.nan]})
um | b | c | e |
---|---|---|---|
um | três | [1, 2] | [5, 6] |
dois | quatro | [3, 4] | NaN |
e eu quero que isso se torne
um | b | c | e |
---|---|---|---|
um | três | [1, 2] | [5, 6] |
dois | quatro | [3, 4] | [sem_valor, sem_valor] |
tentei
df["d"] = np.where(df.d.isna(),
['no_value' for element in df.c],
df.d)
e
df["d"] = np.where(df.d.isna(),
['no_value'] * len(df.c),
df.d)
mas ambos não funcionam. Alguém tem uma ideia?
SOLUÇÃO: Ajustei um pouco a resposta de Paul para:
df[‘d‘] = np.where(df.d.isna(),
pd.Series([['no_value'] * len(lst) for lst in df.c]),
df.d))
Uma possível solução consiste em usar
np.where
.Outra solução possível, que utiliza:
apply
emdf
, iterando por cada linha com uma função lambda que verifica se o valor na colunad
éNaN
.Se a condição for atendida, a função gera uma nova lista preenchida com a string
'no_value'
repetida para corresponder ao comprimento da lista na colunac
.Se
x['d']
não atender a essas condições, o valor originalx['d']
será retido.Saída:
Para usar,
where
temos que construir umnan
array de contenção correto, um que seja comodf.d
, com listas de tipos de objetos.Para ter controle total, comece com um
empty
array de tipos de objetos e preencha-o.Este 2-step não seria necessário se as
df.c
listas variassem em comprimento. Agorawhere
é possível usar a[False, True]
condição para escolher entre elementos dos 2 arrays de dtype de objeto.não funcionará porque é uma forma (2,2) e
where
terá problemas para 'transmitir' isso com os outros termos ((2,) Série).Ou você pode inicializar
x
como