python - 在非常大的数据帧上提高迭代的性能
问题描述
我有一个熊猫数据框,它由 300 万行和 50 列组成,它们都包含整数(正数或负数)。我想创建一个名为“功能”的新列,它从 50 个现有列中获取最大的负数。
例如,如果给定行的 50 列包含值
-25,-24,-23,...,-1,1,...,23,24,25
“功能”列应返回 -1。
因为我的数据框太大了,所以我尝试过的解决方案花费了太长时间。例如,我尝试使用列表推导,但因为我使用 iterrows() 它太慢了(itertuples() 并没有表现得更好):
import numpy as np
import pandas as pd
from tqdm import tqdm
df = pd.read_csv('name_of_file.csv')
for idx, row in tqdm(df[list(np.arange(0,50,1))].iterrows()):
df.loc[idx, 'feature'] = max([n for n in row if n < 0])
对于如此大的数据帧,无需求助于线程来计算此功能的最快方法是什么?
解决方案
您可以改为使用DataFrame.where
将上面的所有值设置0
为NaN
并返回 rowwise max
:
df['feature'] = df.iloc[:,:50].where(df.iloc[:,:50].lt(0)).max(1)
推荐阅读
- asp.net-core - ASP.Net 核心和 ProcessStartInfo
- android - wifi断开后我的重复警报不起作用
- google-app-engine - 使用 TCP 从 App Engine 自定义环境连接到 Google Cloud SQL 时出错
- ios - 从数组中删除特定值,而不是使用索引路径删除
- html - 使用 display flex 和按钮下的显示块按钮
- javascript - 在 Web 浏览器中多次接收 FCM 推送通知
- python-3.x - 如何查找内部列表中的最后一个值在python的嵌套列表中重复了多少次?
- powershell - 用 Powershell 减去日期
- python - 在 python 中解析 csv 并在其他 csv 中写入,是的选择存在,如果选择不存在,则没有
- android - 在视图中滚动出现问题(GridLayot + GridView)