【发布时间】:2021-06-18 10:34:34
【问题描述】:
我正在执行以下计算,这很慢(主要是因为我循环通过的 DataFrame (PM_mix) 非常大)。我知道如果可能的话,您不应该遍历 DataFrame,但我不知道避免这种情况的最佳方法。我觉得解决方案可能是使用 numpy 执行计算,然后将输出数组转换为 DataFrame,但我不知道最好的方法。由于我实际上是在尝试将每个 DataFrame 列乘以一个数组(F_range),是否值得尝试计算一个多维数组,然后展平?我将不胜感激您的任何建议 - 谢谢!
# initial modal abundances
ol_abund = 0.66
opx_abund = 0.17
cpx_abund = 0.12
gar_abund = 0.06
# melting modes
ol_meltmode = 0.0833
opx_meltmode = -0.190
cpx_meltmode = 0.8095
gar_meltmode = 0.298
# calculate bulk D
bulk_D = ol_abund*OIB_D['olivine'] + opx_abund*OIB_D['opx'] + cpx_abund*OIB_D['cpx'] + gar_abund*OIB_D['garnet']
# caclulate bulk P
bulk_P = ol_meltmode*OIB_D['olivine'] + opx_meltmode*OIB_D['opx'] + cpx_meltmode*OIB_D['cpx'] + gar_meltmode*OIB_D['garnet']
# F-range 1 - 5% (0.1% increments)
F_range = np.linspace(0.005,0.04,36)
# loop through and calculate new mixtures
df = pd.DataFrame()
melt_list = []
for col in PM_mix:
# reset dataframe
df = pd.DataFrame()
for F in F_range:
# calculate melt concentration using D and P values for each F
melt = PM_mix[col][:13]/(bulk_D + F*(1 - bulk_P))
# append modeling parameters for each source composition
melt = melt.append(PM_mix[col][13:20])
df[F] = melt
# append percent melt for each iteration
df = df.append(pd.Series(F_range,index=df.columns,name='F'))
melt_list.append(df)
# concatenate list of dataframes into single dataframe
all_melts = pd.concat(melt_list,axis=1)
# renumber columns of dataframe
all_melts.columns = range(np.shape(all_melts)[1])
为了重现问题,bulk_D 和 bulk_P 可以被认为是同一个一维数组:
bulk_D = array([1.78800e-04, 4.91500e-04, 2.28550e-03, 1.13606e-03, 5.21800e-03,
1.17696e-02, 1.37100e-02, 1.85100e-02, 2.95700e-02, 4.00100e-02,
4.25960e-02, 7.73200e-02, 3.44720e-01])
【问题讨论】:
-
您能否添加一个未定义变量的示例(例如
OIB_D),以便我们可以在我们的机器上完全重现问题并为您提供帮助? -
对不起! bulk_D 和 bulk_P 都是一维数组。我在上面添加了一个示例。