【问题标题】:assign value with stochastic function in pandas在熊猫中用随机函数赋值
【发布时间】:2017-12-28 17:51:15
【问题描述】:

我正在尝试根据类别值的值随机分配第四个值(2 种伙伴类型中的一种)。

为 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 的概率,但是在将 assign_buddy 函数应用于 df 时遇到错误消息 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]}

任何见解都值得赞赏!

【问题讨论】:

  • 您能帮我了解一下您是如何完成这项任务的吗?什么是好友?概括地描述您要解决的问题?
  • 当然。希望学习如何定义一个函数以随机地将值分配给合成数据集。希望随机插入值以测试分析测试是否稳健并反映不同的输入。同样,创建概率字典时假设一旦合并进一步的信息(来自单独的文件)就会改变。
  • 尝试学习如何在合成数据集中随机分配值。需要随机插入值来测试分析测试是否稳健并反映不同的输入。一旦进一步的信息(来自单独的文件)被合并,假设创建的概率字典就会改变。 'buddy' 是通用分配属性的占位符。我最终希望学习面向对象的方法来建模人口,但这一步至少让我能够输出样本数据集来学习统计测试。 @coldspeed 非常感谢您的关注和这个论坛!

标签: python pandas stochastic


【解决方案1】:

试试这个

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])

【讨论】:

  • 仍然不确定如何应用功能,但(预计 list_category 会改变)但非常感谢您的帮助。 df["Category"] == val,'Buddy' 过滤器成功了。非常感谢。
  • 没问题。很高兴它有帮助。
猜你喜欢
  • 1970-01-01
  • 2016-05-18
  • 2021-03-14
  • 1970-01-01
  • 2013-05-20
  • 2016-06-04
  • 2014-09-02
  • 1970-01-01
  • 2022-07-20
相关资源
最近更新 更多