J'essaye de créer une nouvelle colonne basée sur les deux colonnes. Supposons que je veuille créer une nouvelle colonne z, et que ce soit la valeur de y lorsqu'elle n'est pas manquante et la valeur de x lorsque y est effectivement manquant. Donc, dans ce cas, je m'attends à ce que z soit [1, 8, 10, 8]
.
x y
0 1 NaN
1 2 8
2 4 10
3 8 NaN
La nouvelle colonne 'z'
récupère ses valeurs dans la colonne 'y'
en utilisant df['z'] = df['y']
. Cela apporte les valeurs manquantes, alors remplissez-les en utilisant fillna
en utilisant la colonne 'x'
. Enchaînez ces deux actions:
>>> df['z'] = df['y'].fillna(df['x'])
>>> df
x y z
0 1 NaN 1
1 2 8 8
2 4 10 10
3 8 NaN 8
Vous pouvez utiliser apply
avec l'option axis=1
. Ensuite, votre solution est assez concise.
df[z] = df.apply(lambda row: row.y if pd.notnull(row.y) else row.x, axis=1)
Utilisation np.where
:
In [3]:
df['z'] = np.where(df['y'].isnull(), df['x'], df['y'])
df
Out[3]:
x y z
0 1 NaN 1
1 2 8 8
2 4 10 10
3 8 NaN 8
Ici, il utilise la condition booléenne et si true renvoie df['x']
autre df['y']
Supposons que DataFrame s'appelle df
. Copiez d'abord la colonne y
.
df["z"] = df["y"].copy()
Ensuite, définissez les emplacements nan de z aux emplacements en x où les nans sont en z.
import numpy as np
df.z[np.isnan(df.z)]=df.x[np.isnan(df.z)]
>>> df
x y z
0 1 NaN 1
1 2 8 8
2 4 10 10
3 8 NaN 8
Je ne sais pas si je comprends la question, mais est-ce ce que vous cherchez?
"if y [i]" sautera si la valeur est nulle.
for i in range(len(x));
if y[i]:
z.append(y[i])
else:
z.append(x[i])
La méthode update
fait presque exactement cela. La seule mise en garde est que update
le fera en place, vous devez donc d'abord créer une copie:
df['z'] = df.x.copy()
df.z.update(df.y)
Dans l'exemple ci-dessus, vous commencez par x
et remplacez chaque valeur par la valeur correspondante de y
, tant que la nouvelle valeur n'est pas NaN
.