【问题标题】:How to sample a dataframe using a dataframe as weights with pandas如何使用数据框作为大熊猫的权重对数据框进行采样
【发布时间】:2021-09-07 12:07:37
【问题描述】:

我想根据权重数据框从数据框的每一列中采样行。 权重数据框的所有列的总和为 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

【问题讨论】:

  • weights is undefined 那应该是weights=w吗?
  • 是的,我刚刚编辑了这个问题,谢谢
  • 那我不清楚逻辑。 sample 需要一个 (1D) 权重列表来确定如何选择 row。但似乎每个细胞都有自己的重量。权重是什么意思?
  • 我希望A的每一列都按照w中相同索引的列进行采样
  • 根据我的理解,第一个数据帧的每一行似乎都对应于新数据帧中的一个列值。这不是示例操作,因为您不是从A 中采样行,而是根据权重生成随机值。这个问题看起来更像是如何根据n 值列表和n 权重列表随机生成m 行和n 列。至于这样做的合理方式,我不确定。

标签: python pandas numpy random sample-data


【解决方案1】:

听起来您希望每列都有独立的样本。如果是这样,我认为这可以满足您的要求:

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

请注意,为了完成这项工作,我将 Aw 转换为您最初拥有的内容。

可能有更巧妙的方法可以做到这一点,但我不知道。

【讨论】:

  • 感谢您的回答。确实,我可以为每一列循环,但我正在寻找一个矢量化的解决方案。由于 pandas 示例的文档表明 weights 参数可以是一个 ndarray 我认为我正在尝试做的事情可以直接实现。
  • 我很确定没有直接的方法可以做到这一点,但对 pandas 有更深入了解的人可能会不同意。 DataFrame.sample 函数旨在对沿轴的项目进行采样,这意味着它确实想要抓取整行或整列,而不是采样抓取单个单元格来组装不在原始帧中的新行。顺便说一句,如果速度是问题,for 循环应该相对容易并行化(但在这种情况下,numpy 数组可能会比 DataFrames 更快)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-18
  • 1970-01-01
  • 2020-01-10
  • 2017-03-19
  • 2022-01-20
  • 2018-03-26
  • 2020-11-18
相关资源
最近更新 更多