Como preencher o valor em falta com base em outras colunas no quadro de dados do Pandas?

19

Suponha que eu tenha um quadro de dados 5 * 3 no qual a terceira coluna contenha valor ausente

1 2 3
4 5 NaN
7 8 9
3 2 NaN
5 6 NaN

Espero gerar valor para a regra baseada em valor ausente nessa primeira coluna da segunda produção

1 2 3
4 5 20 <--4*5
7 8 9
3 2 6 <-- 3*2
5 6 30 <-- 5*6

Como posso usar o quadro de dados? Obrigado.

Como adicionar uma condição para calcular o valor ausente dessa maneira?

if 1st % 2 == 0 then 3rd = 1st * 2nd else 3rd = 1st + 2nd

1 2 3
4 5 20 <-- 4*5 because 4%2==0
7 8 9
3 2 5 <-- 3+2 because 3%2==1
5 6 11 <-- 5+6 because 5%2==1
KyL
fonte
Você não pode fazer isso porque o tamanho não será igual
Mayur Dangar
Você pode expandir sua resposta? Por que não é possível e o que ele poderia fazer para resolver o problema?
Damian Melniczuk 07/07/19
Ei, mesmo eu tenho a mesma pergunta. mas e se os dados com os quais lidar forem textuais? essa é a condição é como "se 'ingredientes' contiverem frango, 'tipo' = não-veg"
user7389747 14/02/19

Respostas:

17

Supondo que três colunas de sua trama de dados é a, be c. Isso é o que você quer:

df['c'] = df.apply(
    lambda row: row['a']*row['b'] if np.isnan(row['c']) else row['c'],
    axis=1
)

Código completo:

df = pd.DataFrame(
    np.array([[1, 2, 3], [4, 5, np.nan], [7, 8, 9], [3, 2, np.nan], [5, 6, np.nan]]), 
    columns=['a', 'b', 'c']
)
df['c'] = df.apply(
    lambda row: row['a']*row['b'] if np.isnan(row['c']) else row['c'],
    axis=1
)
Lâmina gelada
fonte
Alguns anos atrasado, mas isso só funciona quando as colunas são numéricas. np.isnannão suporta dados não numéricos. Não é um problema aqui, pois o OP tinha colunas numéricas e operações aritméticas, mas, caso contrário, pd.isnullé uma alternativa melhor.
Adarsh ​​Chavakula
3

Outra opção:

df.loc[(pd.isnull(df.C)), 'C'] = df.A * df.B

Vishal
fonte
3

Que tal usar o fillna()método do quadro de dados?

df['C'].fillna(df.A * df.B)

yosemite_k
fonte
2

Assumindo que as três colunas em sua trama de dados são a, be c. Então você pode fazer a operação necessária assim:

values = df['a'] * df['b']
df['c'] = values.where(df['c'] == np.nan, others=df['c'])
enterML
fonte
11
Ounp.where(pd.isnull(df.c), df.a * df.b, df.c)
Valentas 16/04/19