web-dev-qa-db-ja.com

Python:既存の列から新しい列を作成する

両方の列に基づいて新しい列を作成しようとしています。新しい列zを作成したいとします。それが欠落していない場合はyの値になり、実際に欠落している場合はxの値になります。したがって、この場合、zは[1, 8, 10, 8]

   x   y
0  1 NaN
1  2   8
2  4  10
3  8 NaN
11
Kexin Xu

新しい列'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
18
Vidhya G

オプションaxis=1を付けてapplyを使用できます。その後、あなたのソリューションはかなり簡潔です。

df[z] = df.apply(lambda row: row.y if pd.notnull(row.y) else row.x, axis=1)
16
Haleemur Ali

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']を返します。

4
EdChum

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
1
Kyler Brown

質問を理解したかどうかわかりませんが、これがあなたが探しているものでしょうか?

「if y [i]」は、値がnoneの場合はスキップします。

for i in range(len(x));
    if y[i]:
        z.append(y[i])
    else:
        z.append(x[i])
0
Red Twoon

updateメソッドはこれをほぼ正確に行います。唯一の注意点は、updateが適切に機能することです。そのため、最初にコピーを作成する必要があります。

df['z'] = df.x.copy()
df.z.update(df.y)

上記の例では、新しい値がxでない限り、yで開始し、NaNの対応する値で各値を置き換えます。

0
ari