【问题标题】:How to split an integer in n parts (each integer)?如何将整数拆分为 n 部分(每个整数)?
【发布时间】:2020-06-18 20:50:06
【问题描述】:

我有类似这样的数据:

在这里,我使用了 python 函数 ffill() 将最后一个有限值填充到下一个 nan 单元格。这就是为什么一个标志下所有日期的数量都是相同的。计数只是标志相同的行数。

现在,我需要像这样拆分数量列:

所以这里 6 被划分为 2+2+1+1 因为 6 需要被划分为 4 行。同样,5 为 1+1+1+1+1,因为我的行数 (9) 比值 (5) 多。所以我可以在开始的 5 行中平均分配 5 作为 1。 我如何在 python 中做到这一点?

【问题讨论】:

  • 你想用new_qty计算什么?
  • 您能否澄清并重申您的进展如何 new_qty?
  • @ScottBoston 看起来他想在 4 行中使用相同的标志尽可能均匀地划分 6,但都是整数。 2+2+1+1 = 6.
  • 您将new_qty 列拆分为不同行的标准是什么。为什么有的6 变成了2 而其他的变成了1?!另外,请遵循此。 stackoverflow.com/help/minimal-reproducible-example
  • 是的。 @Barmar 说的是正确的。所以这里 6 被划分为 2+2+1+1,同样 5 被划分为 1+1+1+1+1,因为我的行数比值多。所以我可以将 5 平均分配为 1。

标签: python python-3.x pandas dataframe


【解决方案1】:

首先定义一个函数,其逻辑将x 拆分为n 部分。

def get_split(x, n):
    if x < n:
        return [1]*x + [0]*(n-x)
    q = x//n
    r = x%n
    c = n-r
    if r == 0:
        return [q]*n
    else:
        return [q+1 if i>=c else q for i in range(n)]

这个函数会返回一个拆分列表

然后使用df['flag'] 列对df 进行分组,并使用上述函数对每个组进行拆分并更新df['new qty'] 列。

df['new qty'] = 0
groups = df.groupby('flag')
for key, grp in groups:  
    x, n = grp.head(1)[['qty', 'count']].values[0]   
    splits = sorted(get_split(x, n), reverse=True)   
    j=0
    for i, row in grp.iterrows():    
        df.loc[i, 'new qty'] = splits[j]
        j+=1

print(df)

结果:

         Date Desciption  qty  flag  count  new qty
0  2019-09-18          A    6     3      4        2
1  2019-09-19          A    6     3      4        2
2  2019-09-20          A    6     3      4        1
3  2019-09-21          A    6     3      4        1
4  2019-09-22          A    5     7      9        1
5  2019-09-23          A    5     7      9        1
6  2019-09-24          A    5     7      9        1
7  2019-09-25          A    5     7      9        1
8  2019-09-26          A    5     7      9        1
9  2019-09-27          A    5     7      9        0
10 2019-09-28          A    5     7      9        0
11 2019-09-29          A    5     7      9        0
12 2019-09-30          A    5     7      9        0

【讨论】:

  • 非常感谢!有效。我有点应用了一些额外的 for 循环来完成工作,而且速度很慢。这有点快。谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-01-06
  • 2018-01-15
  • 1970-01-01
  • 2013-09-29
  • 2015-12-19
  • 1970-01-01
  • 2011-10-04
  • 1970-01-01
相关资源
最近更新 更多