我正在为MC运行一个简单的python脚本。基本上,它读取数据帧中的每一行,并选择两个变量的最大值和最小值。然后,模拟if运行1000次,在最小值和最大值之间选择一个随机值,并计算乘积并将P50值写回数据表。
不知何故,所有行的P50输出都是相同的。我哪里出问题了,有什么帮助吗?
import pandas as pd
import random
import numpy as np
data = [[0.075,0.085, 120, 150], [0.055, 0.075, 150, 350],[0.045,0.055,175,400]]
df = pd.DataFrame(data, columns = ['P_min','P_max','H_min','H_max'])
NumSim = 1000
for index, row in df.iterrows():
outdata = np.zeros(shape=(NumSim,), dtype=float)
for k in range(NumSim):
phi = (row['P_min'] + (row['P_max'] - row['P_min']) * random.uniform(0, 1))
ht = (row['H_min'] + (row['H_max'] - row['H_min']) * random.uniform(0, 1))
outdata[k] = phi*ht
df['out_p50'] = np.percentile(outdata,50)
print(df)
发布于 2019-08-23 21:41:06
通过df['out_p50'] = np.percentile(outdata,50)
,您的意思是希望将整个列设置为给定值,而不是该列的特定行。因此,生成并保存了数字,但将它们保存到整个列中,最后,您将在每行中看到最后生成的数字。
相反,可以使用df.loc[index, 'out_p50'] = np.percentile(outdata,50)
指定要设置的特定行。
发布于 2019-08-23 21:43:49
是的--您正在向整个列写入一个标量值。您可以在每次迭代中覆盖该值。如果您愿意,您可以简单地使用df.loc
指定行,以便快速修复。另外,请考虑使用outdata.median
而不是percentile
。
PANDAS最重要的特性可能是对矢量化的内置支持:您可以处理整个数据列,而不是遍历数据帧。就像列表理解一样思考,在这种理解中,最后不需要for row in df
迭代。
https://stackoverflow.com/questions/57633243
复制相似问题