【问题标题】:Repeat rows based on item count for each row and assign values for repeated rows根据每行的项目计数重复行并为重复行分配值
【发布时间】:2021-05-10 12:54:33
【问题描述】:

我有一个包含该项目的 df,它可以在不同的房间使用

  Item     Room1  Room2  Room3  Room4
  Ball      1       1     1        0
  Bat       1       1     1        1
  Wicket    1       1     1        0

现在我想根据不同房间的项目数重复这些行。例如,对于 Item - Ball,Room1、Room2、Room3 中有三个 1,因此需要重复 3 行,每行仅为 Room1、Room2、Room3 列分配 0,并且 Room4 不考虑用于 Item Ball,它可以是 0对于所有 Ball 项目行。有 300 列不同的房间名称,例如 Room1,room2,room3,room4,BlockArea1,Block2 等。下面是预期的输出

  Item     Room1  Room2  Room3  Room4
  Ball      1       1     1        0
  Ball      1       0     1        0
  Ball      1       1     0        0 
  Bat       1       1     1        1
  Bat       1       1     1        0
  Bat       1       1     0        1
  Bat       1       0     1        1
  Wicket    1       1     1        0
  Wicket    1       0     1        0
  Wicket    1       1     0        0

任何帮助将不胜感激

【问题讨论】:

  • 不为0的行背后的逻辑是什么? (例如预期输出的 Ball 和 Wicket 的第一行)当您说:仅在 Room1、Room2、Room3 列的每一行中分配 0
  • 根据行数只需为 Room1、Room2、Room3 分配零。如果 Ball 有 3 个 1,则只需将 0 分配给其中一列。
  • Ball 有 3 个 1,所以预期输出 Room1 的第一行不应该是 0 而不是 1?
  • 最后对于 Ball 应该有 4 行,需要保留原来的行,对于重复的 3 行,其中一列使其为 0,其余 2 列可以为 1
  • 在您的预期输出中,Ball 的行只有 3 行,包括原始行?

标签: arrays pandas numpy random pivot


【解决方案1】:

举一个更有趣的例子,源行包含 0 在最后一列之外的其他地方,我将 df 创建为:

     Item  Room1  Room2  Room3  Room4
0    Ball      1      1      1      0
1     Bat      1      1      1      1
2  Wicket      1      1      1      0
3    Xxxx      0      1      1      1

第一步是定义一个函数来处理每一行:

def rowProc(row):
    n = 0
    res = []
    for idx, val in row[row > 0].items():
        outRow = row.copy()
        if n > 0:
            outRow[idx] = 0
        res.append(outRow)
        n += 1
    return pd.DataFrame(res)

一个重要的项目细节是源行来自这里 有点“改变”的 DataFrame,即 Item 列将被设置为 索引。所以唯一处理的列是“进一步”(Room...) 列。

对于当前行,它会生成一个 DataFrame,其中包含:

  • 与包含源行的行数一样多,
  • 第一个输出行是源行的精确副本(如 您的预期结果),
  • 其他行的连续行设置为 0

然后运行:

result = pd.concat(df.set_index('Item').apply(rowProc, axis=1).tolist())
result.index.name = 'Item'
result.reset_index(inplace=True)

结果是:

      Item  Room1  Room2  Room3  Room4
0     Ball      1      1      1      0
1     Ball      1      0      1      0
2     Ball      1      1      0      0
3      Bat      1      1      1      1
4      Bat      1      0      1      1
5      Bat      1      1      0      1
6      Bat      1      1      1      0
7   Wicket      1      1      1      0
8   Wicket      1      0      1      0
9   Wicket      1      1      0      0
10    Xxxx      0      1      1      1
11    Xxxx      0      1      0      1
12    Xxxx      0      1      1      0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-01
    • 2014-09-03
    • 1970-01-01
    • 2019-11-20
    • 2016-06-27
    • 1970-01-01
    • 2019-08-04
    相关资源
    最近更新 更多