2017-11-14 14 views
0

私の正確な問題を無駄に検索しました。これら2つのスレッドCreating a new column based on if-elif-else conditioncreate new pandas dataframe column based on if-else condition with a lookupは私のコードを実行するのに失敗しましたが、私のコードをガイドしました。if/elif /と関数に基づいてpandasデータフレームに新しい列を作成

問題:以下に例を示したデータフレームがあります。リージョン属性には2つの値しかありません - aまたはb(またはそれ以上の値を持つこともできます)、年は同じですが、リージョンaは両方とも年などがあります。私がしたいのは、新しい列 "dollars"を作成し、地域 "a" AND yearが例えば2006の場合は、その行の売上を取り、のレートと新しい列 - ドルの値を加算します。私は初心者であり、これまでのところ、関数を介して - 明らかに.apply関数を実行すると、が返されます。ValueError:( 'Seriesの真理値はあいまいで、a.empty、a.bool() a.item()、a.any()またはa.all()。 '、' index 0で発生しました ')。私は特に、データフレームがかなり大きく、計算効率を最適化したいので、より効率的な実装に興味があります。

import pandas as np 

rate_2006, rate_2007 = 100, 200 


c = { 
'region': ["a", "a", "a", "a", "a", "b", "b", "b", "b", "a", "b"], 
'year': [2006, 2007, 2007, 2006, 2006, 2006, 2007, 2007, 2007, 2006, 2007], 
'sales': [500, 100, 2990, 15, 5000, 2000, 150, 300, 250, 1005, 600] 
} 

df1 = pd.DataFrame(c) 
df1 

def new_col(row): 
    if df1["region"] == "a" and df1["year"] == 2006: 
     nc = row["sales"] * rate_2006 
    elif df1["region"] == "a" and df1["year"] == 2007: 
     nc = row["sales"] * rate_2007 
    elif df1["region"] == "b" and df1["year"] == 2006: 
     nc = row["sales"] * rate_2006 
    else: 
     nc = row["sales"] * rate_2007 
    return nc 

df1["Dollars"] = df1.apply(new_col, axis=1) 
df1 

答えて

0

この問題は、使用している方法が原因である可能性があります。それがあなたを助けるかどうかは分かりません。私は自分の知る通りにコードを書いています。

import pandas as pd 

rate_2006, rate_2007 = 100, 200 


c = { 
'region': ["a", "a", "a", "a", "a", "b", "b", "b", "b", "a", "b"], 
'year': [2006, 2007, 2007, 2006, 2006, 2006, 2007, 2007, 2007, 2006, 2007], 
'sales': [500, 100, 2990, 15, 5000, 2000, 150, 300, 250, 1005, 600] 
} 

df1 = pd.DataFrame(c) 
print(df1) 

def new_col(value): 
    if df1.loc[value,"region"] == "a" and df1.loc[value,"year"] == 2006: 
     df1.loc[value,"Dollars"] = df1.loc[value,"sales"] * rate_2006 
    elif df1.loc[value,"region"] == "a" and df1.loc[value,"year"] == 2007: 
     df1.loc[value,"Dollars"] = df1.loc[value,"sales"] * rate_2007 
    elif df1.loc[value,"region"] == "b" and df1.loc[value,"year"] == 2006: 
     df1.loc[value,"Dollars"] = df1.loc[value,"sales"] * rate_2006 
    else: 
     df1.loc[value,"Dollars"] = df1.loc[value,"sales"] * rate_2007 

for value in range(len(df1)): 
    new_col(value) 
+0

あなたの実装はサンプルデータセットで動作し、私が望むものを提供します。私はまだ私の巨大なデータでそれを実行しており、いつ完了するかはわかりません:-)。私が言及したように、おそらく私の方法より効率的なアプローチがあることを知っているので、探し続けるでしょう。 – wrangler

+0

他にも効率的な方法があります。しかし、少なくともこのコードの作業を開始することができ、より良いアプローチを見つけたら、この部分を置き換えることができます。 – Sam

+0

正確に私がやったこと - サムに感謝! – wrangler

関連する問題