【问题标题】:Pythonic way to randomly assign pandas dataframe entries随机分配熊猫数据框条目的Pythonic方法
【发布时间】:2017-04-09 04:20:45
【问题描述】:

假设我们有一个数据框

In [1]: df = pd.DataFrame(np.random.randint(0,100,size=(100, 4)), columns=list('ABCD'))

In [2]: df
Out[3]:
     A   B   C   D
0   45  88  44  92
1   62  34   2  86
2   85  65  11  31
3   74  43  42  56
4   90  38  34  93
5    0  94  45  10
..  ..  ..  ..  ..

如何将 x% 的 所有 条目随机替换为一个值,例如 None

In [4]: something(df, percent=25)
Out[5]:
     A   B   C   D
0   45  88  None  92
1   62  34   2  86
2   None  None  11  31
3   74  43  None  56
4   90  38  34  None
5    None  94  45  10
..  ..  ..  ..  ..

我找到了有关对特定轴进行采样的信息,并且我可以想象一种在我的数据框维度内随机生成整数并将其设置为等于 None 的方法,但这并不像 Python 那样。

  • 编辑:忘记标题中的“方式”

【问题讨论】:

    标签: python pandas random


    【解决方案1】:

    你可以结合DataFrame.wherenp.random.uniform

    In [37]: df
    Out[37]: 
       A  B  C  D
    0  1  0  2  2
    1  2  2  0  3
    2  3  0  0  3
    3  0  2  3  1
    
    In [38]: df.where(np.random.uniform(size=df.shape) > 0.3, None)
    Out[38]: 
          A  B     C     D
    0     1  0     2  None
    1     2  2     0     3
    2     3  0  None  None
    3  None  2     3  None
    

    这不是最简洁的,但可以完成工作。

    请注意,如果您仍有计算工作要做,您应该问自己是否真的想要这样做。如果你将 None 放在一列中,那么 pandas 将不得不使用慢速对象 dtype 而不是像 int64 或 float64 这样的快速对象。

    【讨论】:

    • 我喜欢随机选择真假
    • 谢谢,我实际上对替换无感兴趣,我感兴趣的是用 ' 替换一系列 DNA 序列中的一组随机核苷酸(A、C、G 或 T) N'。我不确定这是否会改变你的答案。我进行了一些测试,试图通过随机选择维度内的整数来做到这一点,但很快就会变得低效。
    • @IanGilman 您正在使用代表核苷酸序列的单个字母的 DataFrame?您可能应该确保您没有使用 object dtype。这将是空间和时间效率低下,如果您知道每个值都是一个字母,您可以将内存使用量减少到使用 object dtype 的一小部分
    猜你喜欢
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    • 2019-03-12
    • 2017-09-21
    • 1970-01-01
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多