python - Python - 200万行表中的计数器
问题描述
例如,我有以下数据框:
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()
解决方案
一种方法是按日期分组并对值求和。其累积总和在该日期时间结束时为您提供网络,然后我们可以按日期重新索引以将结果广播回主框架:
df['plus_minus'] = np.where(df.Balance == 'A', 1, -1)
by_dt = df["plus_minus"].groupby(df["Date"]).sum().cumsum()
df["Counter2"] = by_dt.reindex(df.Date).values
给我
Date Balance Counter plus_minus Counter2
0 2013-04-01 03:50:00 A 1 1 1
1 2013-04-01 04:00:00 A 2 1 2
2 2013-04-01 04:15:00 B 0 -1 0
3 2013-04-01 04:15:00 B 0 -1 0
4 2013-04-01 04:25:00 A 2 1 2
5 2013-04-01 04:25:00 A 2 1 2
6 2013-04-01 04:35:00 B 1 -1 1
7 2013-04-01 04:40:00 B 0 -1 0
8 2013-04-02 04:55:00 B -1 -1 -1
9 2013-04-02 04:56:00 A 0 1 0
10 2013-04-02 04:57:00 A 1 1 1
11 2013-04-03 10:30:00 A 2 1 2
12 2013-04-03 16:35:00 A 3 1 3
13 2013-04-03 20:40:00 A 4 1 4
推荐阅读
- python - 用python3读取txt文件
- reactjs - React 使用 RouteComponentProps - 类型“{}”缺少“只读”类型的以下属性
我正在使用带有 Typescript 的 React,并且需要使用历史记录,因为我需要有 RouteComponentProps 接口
export default class Routes extends Component<RouteComponentProps, a
- python - Python Pyinstaller没有生成exe文件
- android - Recyclerview 在 AppBarLayout 中不可见
- python - 我使用pymysql在MySQL中执行查询,但是为什么关闭连接后进程仍然存在?
- c# - 从基方法调用派生方法的主体
- json - ERROR 错误:未捕获(承诺中):SyntaxError:JSON 中位置 0 处的意外标记 u
- javascript - VueJS 从 axios 承诺中获得价值
- python - 有没有办法在检测屏幕上显示检测到的物体数量?
- android - TextToSpeech API 中的 speak 方法是否将数据发送到 Google 服务器?