【问题标题】:How to create a counter based on another column?如何基于另一列创建计数器?
【发布时间】:2022-12-20 06:51:04
【问题描述】:

我创建了这个数据框 -


Range = np.arange(0,9,1)

A={
0:2,
1:2,
2:2,
3:2,
4:3,
5:3,
6:3,
7:2,
8:2
}

Table = pd.DataFrame({"Row": Range})
Table["Intervals"]=(Table["Row"]%9).map(A)

Table


Row Intervals
0   0   2
1   1   2
2   2   2
3   3   2
4   4   3
5   5   3
6   6   3
7   7   2
8   8   2

我想创建另一个基于间隔列的列,并将作为一种计数器 - 因此值将为 1,2,1,2,1,2,3,1,2。 逻辑是我想按间隔列的值进行计数。 我试过使用 group by 但问题是值显示了多次。

逻辑: 我们有 2 个不同的值 - 2 和 3。每个值将作为值本身出现在间隔列中 - 例如 2 将出现两次 2,2。 3 将出现 3 次 - 3,3,3。 对于前 4 行,值 2 显示两次 - 这就是为什么新列应为 1,2(第一个 2 的计数器)然后再次为 1,2(第二个 2 的计数器)。 之后是 3,所以值为 1,2,3。 然后再次为 2,因此值为 1,2。

希望我设法解释自己。

提前致谢!

【问题讨论】:

  • 你能更详细地解释为什么输出应该是1,2,1,2,1,2,3,1,2吗?我不明白逻辑
  • 目前尚不清楚您希望该列如何。
  • 抱歉,我编辑问题。如果不清楚,请再次查看并 LMK。

标签: python pandas dataframe


【解决方案1】:

您可以使用:

group = Table['Intervals'].ne(Table['Intervals'].shift()).cumsum()
Table['Counter'] = Table.groupby(group).cumcount().mod(Table['Intervals']).add(1)

或者:

group = Table['Intervals'].ne(Table['Intervals'].shift()).cumsum()
Table['Counter'] = (Table.groupby(group)['Intervals']
                    .transform(lambda s: np.arange(len(s))%s.iloc[0]+1)
                    )

输出:

   Row  Intervals  Counter
0    0          2        1
1    1          2        2
2    2          2        1
3    3          2        2
4    4          3        1
5    5          3        2
6    6          3        3
7    7          2        1
8    8          2        2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多