【问题标题】:Add a Rand to each row using Pandas' Assign and a Lambda Function使用 Pandas 的 Assign 和 Lambda 函数为每一行添加一个 Rand
【发布时间】:2018-02-01 08:13:03
【问题描述】:

如何将随机数传递给 lambda 函数,以便 pandas assign 可以使用我为每一行添加不同的随机数。

我最初的尝试,

df = pd.DataFrame({'cat': [1]*10 + [0]*10,
                   'value': [3]*5 + [2]*5 + [2]*2 + [3]*8})

df.assign(cat=lambda df: df.cat + np.random.rand(1)).head(3)

Out[1]:
     cat        value
0   1.962857    3
1   1.962857    3
2   1.962857    3

我们在这里看到随机数0.962857 已添加到所有行。但我希望每一行都有一个不同的rand。我该怎么做?

【问题讨论】:

    标签: python pandas random lambda assign


    【解决方案1】:

    更改1,因为通过lengthDataFrame 将标量返回到数组:

    print (np.random.rand(1))
    [ 0.88642869]
    
    print (np.random.rand(len(df)))
    
    [ 0.42677701  0.89968857  0.87976326  0.07758206  0.43617027  0.03221375
      0.46398119  0.14226246  0.14237448  0.22679517  0.60271752  0.85003435
      0.5676184   0.87565266  0.89830548  0.27066452  0.23907483  0.73784657
      0.09083235  0.98984701]
    

    df = df.assign(cat=lambda df: df.cat + np.random.rand(len(df))).head(3)
    print (df)
            cat  value
    0  1.886429      3
    1  1.426777      3
    2  1.899689      3
    

    【讨论】:

    • 奇怪 - 我试过 df = df.assign(cat=lambda df: df.cat + np.random.rand(df.shape[0], 1)).head(3) 并得到以下错误:Wrong number of items passed ... placement imples 1 这让我失望。谢谢。
    • 你需要df = df.assign(cat=lambda df: df.cat + np.random.rand(df.shape[0])).head(3)
    • 我看到df.shape[0]len(df) 稍微简洁一些,但是为什么pandas 处理n 长度的一维np.array 与nx1 的二维数组如此不同?我认为这是我问题的症结所在。
    • 我认为您需要将其更改为 df = df.assign(cat=lambda df: df[['cat']] + np.random.rand(df.shape[0], 1)).head(3) - df[['cat']] 返回一列 DataFrame
    • @DimKoim - 使用cols = ['cat', 'cat_new'] df[cols] = df[cols] + np.random.rand(len(df), len(cols))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 2019-03-27
    • 2022-01-06
    • 1970-01-01
    • 2017-02-24
    相关资源
    最近更新 更多