【问题标题】:Add IDs to dataframe with random Noise使用随机噪声将 ID 添加到数据帧
【发布时间】:2022-01-13 12:19:16
【问题描述】:

我的初始数据框如下所示:

import pandas as pd
df = pd.DataFrame({
  "id":[1,1,1,1,2,2],
   "time": [1,2,3,4,5,6],
   "x": [1,2,3,4,9,11 ],
   "y": [5,6,7,8,3,2],
})

所以我有两个 ID(1 和 2)或两个不同的时间序列。 现在我想为每个 ID 的 x 和 y 值添加一些随机噪声,并将其保存为初始 df 中的新 ID(具有相同长度):

# Noise
import numpy as np
noise = np.random.normal(0,1,#number of elements you get in array noise)
new_signal = original + noise
# https://stackoverflow.com/questions/14058340/adding-noise-to-a-signal-in-python

因此生成的 df 将如下所示(这些值只是结果输出的一个示例):

df = pd.DataFrame({
  "id":[1,1,1,1,2,2      ,3,3,3,3,    4,4],
   "time": [1,2,3,4,5,6  ,7,8,9,10,    11,12      ],
   "x": [1,2,3,4,9,11,    1.0005,2.3256,3.1256,4.5647,   9.6514,11.4567 ],
   "y": [5,6,7,8,3,2,  5.0505,6.0276,7.1056,8.5607,   3.6014,2.4567],
})

如您所见:添加了 2 个新 ID(3 和 4)以及带有噪声的值。

目前我正在尝试使用不同的循环,但它似乎相当复杂。有什么建议吗?

额外问题:如何不只是复制,而是将其添加 3 次。

【问题讨论】:

    标签: python pandas dataframe numpy


    【解决方案1】:

    您可以构建一个新的数据框并将它们连接起来:

    df1 = pd.concat([df['id'] + df['id'].max(),
                     df['time'] + df['time'].max(),
                     df['x'] + np.random.normal(0, 1, len(df)),
                     df['y'] + np.random.normal(0, 1, len(df))], axis=1) \
            .set_index(df.index + len(x))
    
    out = pd.concat([df, df1])
    

    输出:

    >>> out
        id  time          x         y
    0    1     1   1.000000  5.000000
    1    1     2   2.000000  6.000000
    2    1     3   3.000000  7.000000
    3    1     4   4.000000  8.000000
    4    2     5   9.000000  3.000000
    5    2     6  11.000000  2.000000
    10   3     7   1.479734  5.720535
    11   3     8   0.076273  6.256060
    12   3     9   2.856642  6.845974
    13   3    10   4.119396  7.738969
    14   4    11   9.220569  2.710783
    15   4    12  10.451495  1.245976
    

    【讨论】:

    • 很好,但是重复次数越多,这就越复杂;)
    【解决方案2】:

    您可以reindex 并添加值以增加 id、时间并在数据上添加噪声。

    这适用于任意数量的重复:

    import numpy as np
    
    N = 3
    (df.reindex(np.tile(df.index, N))  # replicate N times the dataframe
       .add(np.c_[np.repeat(np.arange(N), len(df)),         # increment id
                  np.repeat(np.arange(N), len(df))*len(df), # increment time
                  np.r_[np.zeros((len(df), 2)),             # no noise for first
                        np.random.normal(size=(len(df)*(N-1), 2))] # extra noise
                  ])
    )
    

    N=3 为例:

        id  time          x         y
    0  1.0   1.0   1.000000  5.000000
    1  1.0   2.0   2.000000  6.000000
    2  1.0   3.0   3.000000  7.000000
    3  1.0   4.0   4.000000  8.000000
    4  2.0   5.0   9.000000  3.000000
    5  2.0   6.0  11.000000  2.000000
    0  2.0   7.0   0.651240  4.713942
    1  2.0   8.0   1.426533  5.446687
    2  2.0   9.0   3.187928  7.430646
    3  2.0  10.0   2.998382  9.421992
    4  3.0  11.0  10.282871  2.108504
    5  3.0  12.0  10.531258  2.439636
    0  3.0  13.0  -0.200542  5.286711
    1  3.0  14.0   0.350241  8.114173
    2  3.0  15.0   1.843902  6.725896
    3  3.0  16.0   3.831534  7.964400
    4  4.0  17.0   7.612370  2.737872
    5  4.0  18.0  12.129517  2.809689
    

    【讨论】:

      猜你喜欢
      • 2019-12-24
      • 2021-03-14
      • 1970-01-01
      • 1970-01-01
      • 2021-01-12
      • 1970-01-01
      • 2018-12-09
      • 1970-01-01
      • 2015-03-31
      相关资源
      最近更新 更多