【问题标题】:Removing random rows from a data frame until count is equal some criteria从数据框中删除随机行直到计数等于某些标准
【发布时间】:2018-10-04 20:09:02
【问题描述】:

我有一个数据框,其中包含我提供给 Python 中的 ML 库的数据。我拥有的数据分为 5 个不同的任务,t1、t2、t3、t4、t5。我现在拥有的每项任务的数据都是不均匀的,为了简化这里是一个例子。

task, someValue
t1,   XXX
t1,   XXX
t1,   XXX
t1,   XXX
t2,   XXX
t2,   XXX

在上述情况下,我想删除任务标签为“t1”的随机行,直到“t1”的数量与“t2”的数量相等 所以代码运行后应该是这样的:

task, someValue
t1,   XXX
t1,   XXX
t2,   XXX
t2,   XXX

最干净的方法是什么?我当然可以只做 for 循环和 if 条件并使用随机数并计算每次迭代的出现次数,但该解决方案不会很优雅。当然必须有一种使用数据框功能的方法吗?到目前为止,这是我得到的:

def equalize_rows(df):
    t = df['task'].value_counts()
    mininmum_occurance = min(t)

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    你可以计算出你的dataFrame中最少的任务数,然后使用groupby + head 得到每个任务的前N行。

    v = df['task'].value_counts().min()
    df = df.groupby('task', as_index=False).head(v)
    

    df
      task someValue
    0   t1       XXX
    1   t1       XXX
    4   t2       XXX
    5   t2       XXX
    

    【讨论】:

    • 清晰简单的解决方案,谢谢!但遗憾的是它不是随机的,但它仍然应该对我有用! :)
    • @Fupp2 你可以先做df = df.sample(frac=1) 然后df.groupby('task', sort=False, as_index=False).head(v) 如果你想要随机行
    • @Fupp2 抱歉,您需要重新分配:df = df.groupby('task', sort=False, as_index=False).head(v)
    • 啊,好的,谢谢!但是,我现在认为随机可能不是最佳选择。是否可以这样做,但每隔一排开始移除,然后移除头部或其他东西?恐怕数据会出现偏差
    • @Fupp2 我建议看看这个:stackoverflow.com/questions/36390406/… 这不是你问的,但可能会有所帮助
    猜你喜欢
    • 1970-01-01
    • 2019-09-23
    • 2015-04-29
    • 2012-05-16
    • 2017-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多