python - 提高使用掩码的 iterrows() 查询的速度
问题描述
我有一个大型数据集,在内容方面看起来与此类似:
test = pd.DataFrame({'date':['2018-08-01','2018-08-01','2018-08-02','2018-08-03','2019-09-01','2019-09-02','2019-09-03','2020-01-02','2020-01-03','2020-01-04','2020-10-04','2020-10-05'],
'account':['a','a','a','a','b','b','b','c','c','c','d','e']})
对于每个帐户,我正在尝试创建一个列,为具有最早日期的行指定“是”(即使该最早日期重复),否则为“否”。我正在使用以下代码,该代码在该数据的较小子集上运行良好,但不适用于我的整个(较大)数据集。
first_date = test.groupby('account').agg({'date':np.min})
test['first_date'] = 'No'
for row in first_date.iterrows():
account = row[0]
date = row[1].date
mask = (test.account == account) & (test.date == date)
test.loc[mask, 'first_date'] = 'Yes'
有什么改进的想法吗?我对 python 还很陌生,并且已经遇到了使用 pandas DataFrame 的大型数据集的运行时问题。提前致谢。
解决方案
通常,当我们使用 pandas 或 numpy 时,我们希望避免迭代我们的数据并使用提供的矢量化方法。
用于groupby.transform
获取min
每一行的日期,然后用于np.where
创建条件列:
m = test['date'] == test.groupby('account')['date'].transform('min')
test['first_date'] = np.where(m, 'Yes', 'No')
date account first_date
0 2018-08-01 a Yes
1 2018-08-01 a Yes
2 2018-08-02 a No
3 2018-08-03 a No
4 2019-09-01 b Yes
5 2019-09-02 b No
6 2019-09-03 b No
7 2020-01-02 c Yes
8 2020-01-03 c No
9 2020-01-04 c No
10 2020-10-04 d Yes
11 2020-10-05 e Yes
推荐阅读
- java - 在 PagerAdapter 中实现接口
- java - 如何在 Eclipse 中使用 JavaFX 11?
- reactjs - React 将 props 从 const 传递到子组件
- java - 无法在 Eclipse 上使用 Java 的两个类之间传递 Selenium WebDrivers
- html - 在 h2 元素下对齐 p 元素
- angularjs - 如何在angularjs的控制器中获取变量
- python-3.x - apscheduler.add_job 如何使用 trigger 参数?
- php - PHP - 将 9 转换为 09(九月)
- hyperledger-fabric - 带有 Web 应用程序的自定义超账本结构应用程序
- python-3.x - Python遍历函数列表中的一对值