Tenho um Pandas Dataframe que derivo de um processo como este:
df1 = pd.DataFrame({'c1':['A','B','C','D','E'],'c2':[1,2,3,4,5]})
df2 = pd.DataFrame({'c1':['A','B','C'],'c2':[1,2,3],'c3': [np.array((1,2,3,4,5,6)),np.array((6,7,8,9,10,11)),np.full((6,),np.nan)]})
df3 = df1.merge(df2,how='left',on=['c1','c2'])
Isso se parece com isso:
c1 | c2 | c3 |
---|---|---|
UM | 1 | [1,2,3,4,5,6] |
B | 2 | [6,7,8,9,10,11] |
C | 3 | [nan,nan,nan,nan,nan,nan] |
D | 4 | NaN |
E | 5 | NaN |
Para executar a próxima etapa do meu código, preciso que todos os arrays c3
tenham um comprimento consistente. Para as entradas que estavam presentes na junção (ou seja, linhas 1 a 3), isso já foi resolvido. No entanto, para as linhas que estavam faltando, df2
onde agora tenho apenas um NaN
valor (linhas 4 e 5), preciso substituí-las NaN
por um array de NaN
valores, como na linha 3. O problema é que não consigo descobrir como fazer isso.
Tentei várias coisas, começando pelo óbvio:
df3.loc[pd.isnull(df3.c3),'c3'] = np.full((6,),np.nan)
O que me deu uma
ValueError: Must have equal len keys and value when setting with an iterable
Tudo bem; eu entendo esse erro e por que o Python está confuso sobre o que estou tentando fazer. Que tal isso?
for i in df3.index:
df3.at[i,'c3'] = np.full((6,),np.nan) if all(pd.isnull(df3.c3)) else df3.c3
Esse código roda sem erros, mas quando vou imprimir o df3 (ou usá-lo), recebo este erro:
RecursionError: maximum recursion depth exceeded
Essa eu não entendi, mas continuando, e se eu pré-atribuir uma coluna cheia de meus arrays NaN e então eu puder fazer alguma lógica depois da junção:
for i in df1.index: df1.at[i,'c4'] = np.full((6,),np.nan)
Isso me dá o erro compreensível:
ValueError: setting an array element with a sequence
Que tal outra variação da mesma ideia:
df1['c4'] = np.full((6,),np.nan)
Este dá um erro diferente, também compreensível:
ValueError: Length of values (6) does not match length of index (5)
Daí a pergunta: Como substituo valores no meu dataframe (nesse caso, valores nulos) por um array numpy vazio de um determinado comprimento?
Para maior clareza, o resultado final desejado é este:
c1 | c2 | c3 |
---|---|---|
UM | 1 | [1,2,3,4,5,6] |
B | 2 | [6,7,8,9,10,11] |
C | 3 | [nan,nan,nan,nan,nan,nan] |
D | 4 | [nan,nan,nan,nan,nan,nan] |
E | 5 | [nan,nan,nan,nan,nan,nan] |