Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何根据另一列中的特定值和Python中的指定比例为行分配二进制值?_Python 3.x_Pandas - Fatal编程技术网

Python 3.x 如何根据另一列中的特定值和Python中的指定比例为行分配二进制值?

Python 3.x 如何根据另一列中的特定值和Python中的指定比例为行分配二进制值?,python-3.x,pandas,Python 3.x,Pandas,我试图模拟不同种族比例的人群(即英语(en)和非英语(non-en))。在下面的例子中,人口为50:50的英国人和非英国人。然后我想模拟每个群体的特定疾病流行率。例如,我想模拟英语组有10%的人会有疾病(疾病),而非英语组有30%的人会有相同的疾病 ETHNICITY non-en en non-en non-en en non-en en en en non-en 代码: 除了最后一行之外,所

我试图模拟不同种族比例的人群(即英语(en)和非英语(non-en))。在下面的例子中,人口为50:50的英国人和非英国人。然后我想模拟每个群体的特定疾病流行率。例如,我想模拟英语组有10%的人会有疾病(
疾病
),而非英语组有30%的人会有相同的疾病

ETHNICITY
   non-en
       en
   non-en
   non-en
       en
   non-en
       en
       en
       en
   non-en
代码:

除了最后一行之外,所有的东西都可以工作(
TypeError:'DataFrame'对象是可变的,因此不能对它们进行散列处理

[编辑]预期输出:

ETHNICITY    SIM_DIS_STATUS
   non-en    Disease
       en    Disease
   non-en    NonDisease
   non-en    NonDisease
       en    NonDisease
   non-en    Disease
       en    NonDisease
       en    NonDisease
       en    NonDisease
   non-en    NonDisease

这似乎奏效了。我相信有一个更优雅的解决方案

def simulate_disease_prop(df, varname, prop_dict):
    counter = 1
    for key, prop in prop_dict.items():
        df['NEW_V{}'.format(str(counter))] = np.where(df[varname]==key, 
            np.random.choice(['Disease', 'NonDisease'], p=[prop, 1-prop], size=len(df)), np.nan)
            counter += 1

    new_cols = [x for x in df.columns[df.columns.str.contains('NEW_V')]]
    df['TEMP'] = df[new_cols].stack().groupby(level=0).agg(min)
    for i in new_cols:
        del df[i]
    return df['TEMP']

expected_disease_proportion = {
    'en': 0.30,
    'non-en': 0.10
    }

df_test['SIM_DIS_STATUS'] = simulate_disease_prop(df_test, 'ETHNICITY', expected_disease_proportion)
df_test['SIM_DIS_STATUS_V2'] = simulate_disease_prop(df_test, 'ETHNICITY', expected_disease_proportion)

print(df_test)
输出:

  ETHNICITY        TEMP SIM_DIS_STATUS SIM_DIS_STATUS_V2
0    non-en  NonDisease        Disease        NonDisease
1        en     Disease     NonDisease           Disease
2    non-en     Disease     NonDisease           Disease
3    non-en  NonDisease        Disease        NonDisease
4        en  NonDisease        Disease        NonDisease
5    non-en  NonDisease     NonDisease        NonDisease
6        en  NonDisease     NonDisease        NonDisease
7        en  NonDisease     NonDisease        NonDisease
8        en  NonDisease     NonDisease        NonDisease
9    non-en     Disease     NonDisease           Disease

请显示添加到OP的预期输出。
  ETHNICITY        TEMP SIM_DIS_STATUS SIM_DIS_STATUS_V2
0    non-en  NonDisease        Disease        NonDisease
1        en     Disease     NonDisease           Disease
2    non-en     Disease     NonDisease           Disease
3    non-en  NonDisease        Disease        NonDisease
4        en  NonDisease        Disease        NonDisease
5    non-en  NonDisease     NonDisease        NonDisease
6        en  NonDisease     NonDisease        NonDisease
7        en  NonDisease     NonDisease        NonDisease
8        en  NonDisease     NonDisease        NonDisease
9    non-en     Disease     NonDisease           Disease