2017-10-10 9 views
1

私は2つの列を持つデータフレームを持っています。私は3番目の列を作成したいな、というのCol1は他に、その後、COL3 = Col2に、nullの場合COL3 =のCol1 * 2他の2つの関数として列を作成するには?

私が試してみました:

def myf(col1,col2): 
     if pd.isnull(col1): 
      return col2 
     else: 
      return col1 * 2 

    df['col3'] = df.apply(lambda x: myf(df['col1'], df['col2']), axis= 1) 

が、私はエラーを取得する」」というシリーズの真理値は曖昧です "。

どうすればこの問題を解決できますか? 私はそれは決して疑問だと理解していますが、私の小さな、使い慣れたSQLの脳は、パンダの仕組みを理解するために(まだまだ時間がかかる)まだ苦労しています。おそらく私は非常に愚かです、恐らくpandasのドキュメントはおそらく両方とも非常に貧弱です:)

私の適用はDataFrameの行/列ベースで動作し、applymapはDataFrame上で要素ごとに動作し、マップが動作することを理解しています要素的にはSeriesであり、pd.isnullがT/F配列を返すのでエラーが発生することを理解しています。

しかし、このような場合にapplymapやmapを使用する方法はわかりません。この場合、他の2つの列が入力されます。

ありがとうございます!

+1

代わりに 'DF [ 'COL3を'] = np.where行う(df.Col1.isnull()、df.Col2、df.Col1 * 2) ' – Zero

答えて

1

機能に代わりSeries入力としてスカラーためlambda functionxdfを変更する必要があります。

df['col3'] = df.apply(lambda x: myf(x['col1'], x['col2']), axis= 1) 

別速く解決策は、combine_firstまたはSeries.whereである:

df['col3'] = df['col1'].mul(2).combine_first(df['col2']) 

df['Col3'] = df['col2'].where(df['col1'].isnull(), df['col1']*2) 
2

あなたはfillnaを使用することができます。

df.col1.mul(2).fillna(df.col2) 

df = pd.DataFrame({ 
    'col1': [1, 2, pd.np.nan, 3, pd.np.nan], 
    'col2': [2, pd.np.nan, 3, 2, pd.np.nan] 
}) 

df['col3'] = df.col1.mul(2).fillna(df.col2) 
df 
# col1 col2 col3 
#0 1.0 2.0 2.0 
#1 2.0 NaN 4.0 
#2 NaN 3.0 3.0 
#3 3.0 2.0 6.0 
#4 NaN NaN NaN 
関連する問題