我想根据权重数据帧对数据帧的每列中的行进行采样。权重的数据帧的所有列的总和为1。
A=pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]]).transpose()
w=pd.DataFrame([[0.2,0.5,0.3],[0.1,0.3,0.6],[0.4,0.5,0.1]])
sampled_data = A.sample(n=10, replace=True, weights=w)
但此代码会产生以下错误
ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
显然,我希望根据w的第一列的权重对A的第一列进行采样,以此类推
使用这样的解决方案:
sampled_data =
1 2 3
0 2 6 8
1 2 5 7
2 3 4 8
. .....
9 1 6 9
听起来您需要来自每列的独立样本。如果是这样的话,我认为这就是你想要的:
import pandas as pd
A=pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]]).transpose()
w=pd.DataFrame([[0.2,0.5,0.3],[0.1,0.3,0.6],[0.4,0.5,0.1]]).transpose()
L=[]
for i in [0,1,2]:
s=A[i].sample(n=10,replace=True,weights=w[i])
L.append(s.values)
A_sample=pd.DataFrame(L).transpose()
print(A_sample)
输出为
0 1 2
0 3 6 7
1 2 5 8
2 3 6 8
3 1 6 7
4 1 5 8
5 3 6 8
6 1 6 9
7 1 6 7
8 2 4 8
9 2 6 7
请注意,为了实现这一点,我将A
和w
作为原来的转置。
也许有一种更巧妙的方法可以做到这一点,但我不知道。