使用不同的值(随机分布)填充DataFrame的一列中的每一行

2024-06-16 14:41:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个与aprox有关的数据帧。4列200行。我用空值创建了第5列:

df['minutes'] = np.nan 

然后,我想用随机逆对数正态值填充这个新列的每一行。生成1逆对数正态的代码

注意:如果下面的代码运行了多次,它将生成一个新的结果,因为ppf():random.random()

^{pr2}$

当我这样做的时候,它用相同的数字填充了df['minutes']的所有200行,而不是像我预期的那样为每一行触发random.random()。在

我该怎么办?我尝试使用for loop,但显然我没有正确地使用它(给出相同的结果):

for i in range(1,len(df)):
df['minutes'] = df['minutes'].fillna(stats.lognorm(0.5, scale=np.exp(1.8)).ppf(random.random()).astype(int))

我做错什么了?在

另外,如果另一列的值是0或1,我将需要更改上面inverse log normal的一些参数。如:

if df['type'] == 0:
     df['minutes'] = df['minutes'].fillna(stats.lognorm(0.5, scale=np.exp(1.8)).ppf(random.random()).astype(int))
elif df['type'] == 1:
     df['minutes'] = df['minutes'].fillna(stats.lognorm(1.2, scale=np.exp(2.7)).ppf(random.random()).astype(int))

提前谢谢。在


Tags: dfforstatstypenp对数randomint
2条回答

这里使用fillna的问题是,该函数以一个作为参数,并将其应用于沿指定轴的每个元素。因此,只计算一次stat值,然后将其分配到每一行。在

您需要的是为轴上的每个元素调用函数,因此参数必须是函数本身,而不是值。这是apply的一项工作,它接受一个函数并将其应用于沿轴的元素。在

我直接跳到你的最终要求:

您可以在minutes-列上使用apply(作为熊猫系列方法),然后将相应结果分配给type列的minutes列过滤行:

import numpy as np
import pandas as pd
import scipy.stats as stats
import random

# setup
df = pd.DataFrame(np.random.randint(0, 2, size=(8, 4)),
                  columns=list('ABC') + ['type'])
df['minutes'] = np.nan


df.loc[df.type == 0, 'minutes'] = \
    df['minutes'].apply(lambda _: stats.lognorm(
        0.5, scale=np.exp(1.8)).ppf(random.random()).astype(int),
                    convert_dtype=False))

df.loc[df.type == 1, 'minutes'] = \
    df['minutes'].apply(lambda _: stats.lognorm(
        1.2, scale=np.exp(2.7)).ppf(random.random()).astype(int),
                    convert_dtype=False))

。。。或者使用apply作为一个数据帧方法,该方法使用一个包装逻辑的函数来区分type-column的值,并将结果分配回minutes-列:

^{pr2}$

用不同的思维方式完成了一些步骤:

  • 创建了2个列表,每个列表都有我自己的参数
  • 已使用NumPy's append 所以每一行都有不同的随机数

     lognormal_tone = []
     lognormal_ttwo = []
     for i in range(len(s)):
         lognormal_tone.append(stats.lognorm(0.5, scale=np.exp(1.8)).ppf(random.random()).astype(int))
         lognormal_ttwo.append(stats.lognorm(0.4, scale=np.exp(2.7)).ppf(random.random()).astype(int))
    

然后,将它们与先前创建的另一个列表一起包含在数据帧中:

df = pd.DataFrame({'arrival':arrival,'minTypeOne':lognormal_tone, 'minTypeTwo':lognormal_two})

相关问题 更多 >