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