我正在为MC运行一个简单的python脚本。基本上,它会读取数据帧中的每一行,并选择两个变量的最大值和最小值。然后,如果模拟运行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)
答案 0 :(得分:1)
通过df['out_p50'] = np.percentile(outdata,50)
表示您希望将整个列设置为给定值,而不是该列的特定行。因此,将生成并保存编号,但它们会保存到整列中,最后,您会在每行中看到最后生成的编号。
请使用df.loc[index, 'out_p50'] = np.percentile(outdata,50)
指定要设置的特定行。
答案 1 :(得分:0)
是的-您正在将标量值写入整个列。您在每次迭代时都覆盖该值。如果需要,您可以简单地用df.loc
指定行以进行快速修复。还可以考虑使用outdata.median
而不是percentile
。
也许PANDAS的最重要功能是对矢量化的内置支持:您可以处理整个数据列,而不是遍历数据帧。就像列表理解一样,不需要在最后进行for row in df
迭代。