2017-12-28 16 views
0

カテゴリ値の値に基づいて4番目の値(2つのタイプの1つのバディ)を割り当てようとしています。パンダの確率的関数で値を代入する

3つの機能のためにランダムに割り当てられた値を持つ小さなDF:カテゴリ、年齢、性別

 Unique_ID Category Age  Sex  Buddy 
0  0   2   11  male  NaN 
1  1   3   7  female  NaN 
2  2   1   4  male  NaN 
3  3   2   20  male  NaN 
4  4   1   19  female  NaN 

私はハードコードに関数を作った答え

に役立つ場合、私はDFを生成するコードが含まにnp.random.choiceの確率ですが、dfにassign_buddy関数を適用するとエラーメッセージが表示される ValueError:Seriesの真理値があいまいです。 a.empty、a.bool()、a.item()、a.any()またはa.all()を使用します。

columns = ['Unique_ID', 'Category', 'Age', 'Sex', 'Buddy'] 
df = pd.DataFrame(columns=columns) 

Sexes = ['female', 'male'] 
df.Sex = np.random.choice(a=Sexes, size=n, p=[0.6, 0.4]) 

list_Category = [1,2,3,4] 
df.Category = np.random.choice(a=list_category, size=n, p=[0.3, 0.4, 0.2, 0.1]) 

buddy_list = ['buddy_1', 'buddy_2'] 

def assign_buddy(Category_prob_list): 
""" 
takes in a Category value 
return: Buddy 
"""  
    if df['Category'] == list_Category[0]: 
     df['Buddy'] = np.random.choice(a=buddy_list, size=n, p=[0.1, 0.9]) 
     return df['Buddy'] 
    elif df['Category'] == list_Category[1]: 
     df['Buddy'] = np.random.choice(a=buddy_list, size=n, p=[0.3, 0.7]) 
     return df['Buddy'] 
    elif df['Category'] == list_Category[2]: 
     df['Buddy'] = np.random.choice(a=buddy_list, size=n, p=[0.7, 0.3]) 
     return df['Buddy'] 
    elif df['Category'] == list_Category[3]: 
     df['Buddy'] = np.random.choice(a=buddy_list, size=n, p=[0.9, 0.1]) 
     return df['Buddy'] 
    else: 
     pass 
# should apply assign_buddy to each row in df 
df['Category'].apply((assign_buddy)) 

私はassign_buddyの確率の辞書を持っていますが、すべてのドキュメントにもかかわらずマップを把握してロジックを適用することはできません。

dからnp.random.choiceの引数pに渡す確率を返す関数を作成しようとしましたが、機能しません。

# key is category label and values are probabilities for np.random.choice 
d = {1: [0.1, 0.9], 2: [0.3, 0.7], 3: [0.7, 0.3], 4: [0.9, 0.1]} 

+0

を試してみてください?バディとは何ですか?あなたが解決しようとしている問題を、高いレベルで説明してください。 –

+0

合成データセットに確率的に値を割り当てる関数を定義する方法を学びたいと考えています。分析テストが堅牢で、異なる入力を反映しているかどうかをテストするために確率的に値を挿入しようとしています。同様に、確率の辞書は、別の情報(別々のファイルから)が組み入れられると仮定して作成されました。 – user426

+0

は、合成データセットに確率的に値を割り当てる方法を学びます。分析テストが堅牢で、異なる入力を反映しているかどうかをテストするために、確率的に値を挿入する必要があります。さらに別の情報(別々のファイルから)が変更される仮定で作成された確率の法則が組み込まれています。 'buddy'はジェネリックに割り当てられた属性のプレースホルダーです。私は最終的に、モデル集団のためのオブジェクト指向のアプローチを学ぶために探していますが、このステップでは、少なくとも統計データのテストを学ぶためのサンプルデータセットを出力することができます。 @倍速はあなたの注意とこのフォーラムに本当に感謝しています! – user426

答えて

0

はあなたが私はあなたがこの割り当てを実行している方法を理解するのに役立つことができます。この

n = 20 
columns = ['Unique_ID', 'Category', 'Age', 'Sex', 'Buddy'] 
df = pd.DataFrame(columns=columns) 

list_category = [1,2,3,4] 
buddy_list = ['buddy_1', 'buddy_2'] 
Sexes = ['female', 'male'] 
df.Sex = np.random.choice(a=Sexes, size=n, p=[0.6, 0.4]) 
df.Category = np.random.choice(list_category, size=n, p=[0.3, 0.4, 0.2, 0.1]) 

d = {1: [0.1, 0.9], 2: [0.3, 0.7], 3: [0.7, 0.3], 4: [0.9, 0.1]} 

for val in list_category: 
    sz = (df["Category"] == val).sum() # find the size for array to create 
    # use `loc` to select places you want to replace 
    df.loc[df["Category"] == val,'Buddy'] = np.random.choice(
               buddy_list, sz, p=d[val]) 
+0

このトリックは – user426

+0

でも機能の適用方法はわかりませんが(list_categoryが変更されることを期待していますが)本当に助けに感謝しています。 df ["Category"] == val、 'Buddy'フィルターがトリックをしました。どうもありがとうございます。 – user426

+0

問題ありません。それがうれしいです。 – Tai

関連する問題