【问题标题】:Randomly sample non-empty column values for each row of a pandas dataframe为 pandas 数据帧的每一行随机采样非空列值
【发布时间】:2021-10-06 08:27:02
【问题描述】:

对于每一行,我想随机抽取与非空值对应的 k 个列索引。

如果我从这个数据框开始,

A = pd.DataFrame([
    [1, np.nan, 3, 5],
    [np.nan, 2, np.nan, 7],
    [4, 8, 9]
])
>>> A
    0   1   2   3
0   1.0 NaN 3.0 5.0
1   NaN 2.0 NaN 7.0
2   4.0 8.0 9.0 NaN

如果我想为每一行随机采样 2 个非空值并将它们更改为值 -1,可以这样做的一种方法如下:

B = A.copy()

for i in A.index:
    s = A.loc[i]
    s = s[s.notnull()]
    col_idx = random.sample(s.index.tolist(), 2)
    B.iloc[i, col_idx] = -1

>>> B
    0   1   2   3
0   -1.0    NaN -1.0    5.0
1   NaN -1.0    NaN -1.0
2   -1.0    -1.0    9.0 NaN

在 Pandas 中是否有更好的方法可以避免使用 for 循环? pandas.DataFrame.sample 方法似乎使每行中采样的列数保持不变。但是如果数据框有空洞,每行的非空值的数量就不会是恒定的。

【问题讨论】:

    标签: python pandas dataframe random sample


    【解决方案1】:

    在您的情况下,将stack groupbysample 一起使用,将值 update 更改回来

    s = A.stack().groupby(level=0).sample(n=2)
    s[:] = -1
    A.update(s.unstack())
    A
    Out[122]: 
         0    1    2    3
    0  1.0  NaN -1.0 -1.0
    1  NaN -1.0  NaN -1.0
    2 -1.0  8.0 -1.0  NaN
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-16
      • 2018-02-01
      • 2019-12-28
      • 2017-09-03
      相关资源
      最近更新 更多