両方の列に基づいて新しい列を作成しようとしています。新しい列zを作成したいとします。それが欠落していない場合はyの値になり、実際に欠落している場合はxの値になります。したがって、この場合、zは[1, 8, 10, 8]
。
x y
0 1 NaN
1 2 8
2 4 10
3 8 NaN
新しい列'z'
は、'y'
を使用して列df['z'] = df['y']
から値を取得します。これにより欠落した値が取り込まれるため、列'x'
を使用してfillna
を使用して値を入力します。これらの2つのアクションをチェーンします。
>>> 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
オプションaxis=1
を付けてapply
を使用できます。その後、あなたのソリューションはかなり簡潔です。
df[z] = df.apply(lambda row: row.y if pd.notnull(row.y) else row.x, axis=1)
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
ここでは、ブール条件を使用し、trueの場合はdf['x']
を、それ以外の場合はdf['y']
を返します。
DataFrameがdf
と呼ばれているとしましょう。最初にy
列をコピーします。
df["z"] = df["y"].copy()
次に、zのnanの位置を、nanがzにあるxの位置に設定します。
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
質問を理解したかどうかわかりませんが、これがあなたが探しているものでしょうか?
「if y [i]」は、値がnoneの場合はスキップします。
for i in range(len(x));
if y[i]:
z.append(y[i])
else:
z.append(x[i])
update
メソッドはこれをほぼ正確に行います。唯一の注意点は、update
が適切に機能することです。そのため、最初にコピーを作成する必要があります。
df['z'] = df.x.copy()
df.z.update(df.y)
上記の例では、新しい値がx
でない限り、y
で開始し、NaN
の対応する値で各値を置き換えます。