【发布时间】:2018-08-10 03:54:57
【问题描述】:
我正在尝试在 pandas df 中返回 count 的 unique 值。这是每个row 的累积计数。我的目标是合并一个函数来确定当前在任何时间点出现了多少值。
import pandas as pd
df = pd.DataFrame({
'A' : ['8:06:00','11:00:00','11:30:00','12:00:00','13:00:00','13:30:00','14:00:00','17:00:00'],
'B' : ['ABC','ABC','DEF','XYZ','ABC','LMN','DEF','ABC'],
'C' : [1,2,1,1,3,1,2,4],
})
A B C
0 8:06:00 ABC 1
1 11:00:00 ABC 2
2 11:30:00 DEF 1
3 12:00:00 XYZ 1
4 13:00:00 ABC 3
5 13:30:00 LMN 1
6 14:00:00 DEF 2
7 17:00:00 ABC 4
所以col['B'] 中有 4 个unique 值。我正在测量的
df1 = df['B'].nunique()
但我希望通过column 合并一个函数iterates,以识别是否再次出现任何特定值。如果不是,我希望减少计数。如果这是第一次出现该值,我想增加计数。如果该值已经出现并再次出现,则计数应保持不变。这将显示在任何时间点发生了多少值。
使用@jpp 的代码,我们生成以下内容:
cum_maxer = pd.Series(pd.factorize(df['B'])[0] + 1).cummax()
df['res'] = cum_maxer - df['B'].duplicated().cumsum()
print(df)
输出:
A B C res
0 8:06:00 ABC 1 1
1 11:00:00 ABC 2 0
2 11:30:00 DEF 1 1
3 12:00:00 XYZ 1 2
4 13:00:00 ABC 3 1
5 13:30:00 LMN 1 2
6 14:00:00 DEF 2 1
7 17:00:00 ABC 4 0
'res' 的预期输出
0 1
1 1
2 2
3 3
4 2
5 3
6 2
7 1
基本上,如果value 第一次出现我想将它添加到cumulative count。如果该值完成(稍后未出现),则计数应减少。如果值已经出现并再次出现,则计数应保持不变。
每一行的概要和预期的输出:
1st row、ABC 首次出现,稍后出现。 Count = +1
2nd row, ABC 再次出现所以没有增加。它也出现在以后,所以没有减少。 Count = no change
3rd row、DEF 首次出现,稍后出现。 Count = +1
4th row、XYZ 是第一次出现,但后来没有出现。不过,此时出现了 3 个值,因此 count is 3。计数自动下降到下一行为XYZ has finished
5th row,如上所述,XYZ 已完成,因此目前只有ABC 和DEF 处于启用状态。 ABC 值也再次出现,因此 count is 2。
6th row、LMN 首次出现,因此计数增加。这意味着ABC, DEF, LMN 在该时间点是最新的。就像row 4 一样,LMN 不会再次出现,因此当LMN 完成时,下一行的计数将减少。 Count is 3
第 7 行,DEF 和 ABC 当前处于启用状态,因此 count is 2。由于DEF 不再出现,因此计数将在下一行减少。
第 8 行,ABC 是当前唯一的值,所以 count is 1。
【问题讨论】:
-
为什么行
3不是3 1在您的预期输出中? -
我没有跟踪 - 你是什么意思“它回落到 2 因为 XYZ 不再出现”?这是某种累积计数,还是按每个
B值分组的计数,还是某种索引?多一点解释将有助于理解您的最终向量。 -
我没有很好地解释它,但它是唯一值的累积。我现在换个问题。
-
@JeremyAlexander 如果重复 ABC,为什么前两行有
1和1? -
@RafaelC 有意义吗?
标签: python pandas count unique