<p>我会用numpy广播一次性完成这一切。。。在</p>
<pre><code>train_ = pd.DataFrame(
(train.values * pop.values[:, None]).reshape(-1, train.shape[1]),
pd.MultiIndex.from_product([pop.index, train.index]),
train.columns
)
train_
feature0 feature1 feature2 feature3 feature4 feature5
0 0 18.279579 -3.921346 0.000000 -0.000000 -0.000000 -18.265003
1 17.899545 -15.503942 -0.000000 -0.000000 -0.000000 4.398419
4 16.432750 -22.490190 -0.000000 -0.000000 -0.000000 -2.433374
5 15.905368 -4.812785 0.000000 0.000000 0.000000 -1.074326
6 16.991823 -15.946251 0.000000 0.000000 0.000000 -1.482333
1 0 0.000000 -3.921346 0.000000 -7.250185 -0.000000 -0.000000
1 0.000000 -15.503942 -0.000000 -0.053619 -0.000000 0.000000
4 0.000000 -22.490190 -0.000000 -15.247781 -0.000000 -0.000000
5 0.000000 -4.812785 0.000000 3.742221 0.000000 -0.000000
6 0.000000 -15.946251 0.000000 8.057511 0.000000 -0.000000
2 0 0.000000 -0.000000 0.000000 -0.000000 -0.000000 -18.265003
1 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 4.398419
4 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -2.433374
5 0.000000 -0.000000 0.000000 0.000000 0.000000 -1.074326
6 0.000000 -0.000000 0.000000 0.000000 0.000000 -1.482333
3 0 0.000000 -0.000000 13.611829 -0.000000 -11.773605 -18.265003
1 0.000000 -0.000000 -0.741729 -0.000000 -6.734652 4.398419
4 0.000000 -0.000000 -4.611659 -0.000000 -13.941488 -2.433374
5 0.000000 -0.000000 18.291712 0.000000 3.631887 -1.074326
6 0.000000 -0.000000 8.299577 0.000000 8.057510 -1.482333
</code></pre>
<p>您可以只访问与第i行相对应的行或使用<code>train_.loc[i]</code>访问{<cd1>}</p>
^{pr2}$
<hr/>
<p><strong>粗糙时间测试</strong><br/>
<em>我懒得做更健壮的测试</em></p>
<pre><code>%%timeit
pd.DataFrame(
(train.values * pop.values[:, None]).reshape(-1, train.shape[1]),
pd.MultiIndex.from_product([pop.index, train.index]),
train.columns
)
%%timeit
res = pop.iloc[np.repeat(np.arange(len(pop)), len(train))]
res = res.set_index(np.tile(train.index, len(pop)), append=True).add_prefix('feature')
res.mul(train, level=1)
%%timeit
pd.concat([train * pop.values[i] for i in range(pop.shape[0])],
keys=pop.index.tolist())
571 µs ± 10.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
1.42 ms ± 18 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
1.7 ms ± 69.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
</code></pre>