【发布时间】:2018-07-20 12:29:16
【问题描述】:
例如,我有以下数据框:
Date Balance
2013-04-01 03:50:00 A
2013-04-01 04:00:00 A
2013-04-01 04:15:00 B
2013-04-01 04:15:00 B
2013-04-01 04:25:00 A
2013-04-01 04:25:00 A
2013-04-01 04:35:00 B
2013-04-01 04:40:00 B
2013-04-02 04:55:00 B
2013-04-02 04:56:00 A
2013-04-02 04:57:00 A
2013-04-03 10:30:00 A
2013-04-03 16:35:00 A
2013-04-03 20:40:00 A
我的目标是添加一列“计数器”,它基本上显示了 A 和 B 数量的平衡。因此,每次出现 A 时,计数器列都会增加一个值。每出现一次B,计数器列就减少一个值。如果两个 A 在同一时间(同一日期)出现在两个连续的行中,则这两行的余额应增加两个(相同的推理适用于连续的 B 或同时适用于 A 和 B)。因此,数据框最终将如下所示:
Date Balance Counter
2013-04-01 03:50:00 A 1
2013-04-01 04:00:00 A 2
2013-04-01 04:15:00 B 0
2013-04-01 04:15:00 B 0
2013-04-01 04:25:00 A 2
2013-04-01 04:25:00 A 2
2013-04-01 04:35:00 B 1
2013-04-01 04:40:00 B 0
2013-04-02 04:55:00 B -1
2013-04-02 04:56:00 A 0
2013-04-02 04:57:00 A 1
2013-04-03 10:30:00 A 2
2013-04-03 16:35:00 A 3
2013-04-03 20:40:00 A 4
主要问题是数据帧有超过 200 万行,因此执行循环非常耗时。有没有办法实现这个问题的矢量化方法?
编辑(如果连续行的日期不同,我能够编译出一个运行良好的解决方案)。任何人都可以帮我弄清楚其余的事情吗?
d = {'Date': ['2013-04-01 03:50:00', '2013-04-01 04:00:00','2013-04-01
04:15:00','2013-04-01 04:15:00','2013-04-01 04:25:00',
'2013-04-01 04:25:00','2013-04-01 04:35:00','2013-04-01 04:40:00','2013-04-
02 04:55:00','2013-04-02 04:56:00',
'2013-04-02 04:57:00','2013-04-03 10:30:00','2013-04-03 16:35:00','2013-04-
03 20:40:00'], 'Balance': ['A','A','B','B','A','A','B','B','B',
'A','A','A','A','A',]}
df = pd.DataFrame(data=d)
df['plus_minus'] = np.where(df.Balance == 'A', 1, -1)
df['Counter'] = df['plus_minus'].cumsum()
【问题讨论】:
-
我不确定您的示例输出和描述是否匹配?为什么不是
[2, 2, 0, 0...]或[1, 2, 1, 0...]? -
@JonClements 我认为这是因为当有两个连续的 A 或 B 时,它会立即增加 2 个单位,而不是两次增加 1 个单位。
-
Miguel,你能告诉我们你到目前为止所做的工作吗?
-
我不明白你的意思。前两个日期不同。因此应该是[1,2]。那么,第三个和第四个日期是完全相同的,因此,计数器应该在它们上都减少两个。所以,前四个数字应该是 [1,2,0,0]
-
@StephenWitkowski,我刚刚编辑了问题。
标签: python pandas vectorization counter