用重复数据填充数据框,直到满足特定条件

Posted

技术标签:

【中文标题】用重复数据填充数据框,直到满足特定条件【英文标题】:Fill dataframe with duplicate data until a certain conditin is met 【发布时间】:2021-11-16 14:08:12 【问题描述】:

我有一个像 df 这样的数据框,

id name age duration
1  ABC  20   12
2  sd   50   150
3  df   54   40

我想在同一个df中复制这些数据,直到持续时间总和大于或等于300,

所以df可以像..

id name age duration
1  ABC  20   12
2  sd   50   150
3  df   54   40
2  sd   50   150

到目前为止,我已经尝试了以下代码,但有时它会在无限循环中运行:/。 请帮忙。

def fillPlaylist(df,duration):
    print("inside fill playlist fn.")
    if(len(df)==0):
        print("df len is 0, cannot fill.")
        return df;

    receivedDf= df
    print("receivedDf",receivedDf,flush=True)
    print("Received df len = ",len(receivedDf),flush=True)
    print("duration to fill ",duration,flush=True)
    while df['duration'].sum() < duration:
        # random 5% sample of data.
        print("filling")
        ramdomSampleDuplicates = receivedDf.sample(frac=0.05).reset_index(drop=True)
        df = pd.concat([ramdomSampleDuplicates,df])
        print("df['duration'].sum() ",df['duration'].sum())
    print("after filling df len = ",len(df))
    return df;

【问题讨论】:

【参考方案1】:

尝试使用n 而不是frac

n 从您的数据框中随机抽取 n 行。

sample_df = df.sample(n=1).reset_index(drop=True)

要使用frac,你可以用这种方式重写你的代码。

def fillPlaylist(df,duration):
    while df.duration.sum() < duration:
        sample_df = df.sample(frac=0.5).reset_index(drop=True)
        df = pd.concat([df,sample_df])
    return df

【讨论】:

谢谢你能解释一下这是如何工作的吗?使用 frac 时它不起作用? @R.singh 你的方法也应该有效。 frac 对数据框中的一小部分行进行采样,n randonly 从您的数据框中采样 n 行。但是,替换receivedDf= df receivedDf= df.copy() @R.singh 我已经为您的用例使用frac 重写了代码。如果有帮助,请批准解决方案:)

以上是关于用重复数据填充数据框,直到满足特定条件的主要内容,如果未能解决你的问题,请参考以下文章

如何重复代码直到满足特定条件? [复制]

如果满足条件,则更改值,数据框[重复]

Pandas:如何根据特定列上特定值的条件选择数据框中的行[重复]

在熊猫多索引数据框中返回满足逻辑索引条件的每个组的最后一行[重复]

熊猫数据框:在固定其他列的列中提取具有特定标准/条件最小值的数据[重复]

合并 Pandas 数据框中的 2 列,用前一个值填充 NaN [重复]