python - 慢熊猫查询以根据条件在行之间获取差异
问题描述
我有一个大数据框作为输入,如下所示:
index type price
3000 C 300
3000 P 500
3500 C 300
3500 P 400
4500 P 100
我想获得指数值,对于相同的指数但不同类型(C 和 P),价格差异最小。
现在我执行以下操作,但这需要几秒钟:
k_c = np.unique(df.index[(df['type'] == 'C')])
k_p = np.unique(df.index[(df['type'] == 'P')])
common_k = np.intersect1d(k_c, k_p)
diff = [np.abs(df['price'][(df['type'] == 'C') & (df.index == k)].values[0] -
df['price'][(df['type'] == 'P') & (df.index == k)].values[0]) for k in common_k]
min_index = common_k[np.argmin(diff)]
有没有办法让它更快?
解决方案
在axis = 1上尝试pivot
+ ,然后:diff
idxmin
min_index = (
df.reset_index()
.pivot(index='index', columns='type', values='price')
.dropna()
.diff(axis=1).iloc[:, -1].abs().idxmin()
)
min_index
:
3500
*注意pivot
仅在同一索引中没有重复的“C”或“P”值时才有效。
pivot
每个索引并排获取值:
df.reset_index().pivot(index='index', columns='type', values='price')
type C P
index
3000 300.0 500.0
3500 300.0 400.0
4500 NaN 100.0
dropna
摆脱没有两个值的行:
type C P
index
3000 300.0 500.0
3500 300.0 400.0
diff
在轴 1 上:
type C P
index
3000 NaN 200.0
3500 NaN 100.0
iloc
获取最后一列(累积差异的位置)。
index
3000 200.0
3500 100.0
Name: P, dtype: float64
abs
获取每个元素的绝对数值。
idxmin
获取最小值的索引:
3500
推荐阅读
- php - Laravel 请求具有复杂 url 的通配符
- python - Django Money - 添加两个不同货币的 MoneyField 并以给定货币生成输出
- android - 为什么 Google Play 控制台的 Active Installs 一天内减少到 0?
- php - 使用php循环无法将数据库中的日期与当前日期匹配
- php - Laravel 路由问题。不工作 - 未定义错误
- sublimetext3 - Sublime thTheme 范围:回声中的变量
- vba - 用于批量延迟的涓流发送的 Outlook 宏?这可能吗?
- jekyll - "jekyll build --lsi" 使博客变得非常缓慢
- python - 有没有办法专门将 DNS 端口 53 绑定到 TCP 或 UDP?
- python - python中具有多输入多输出的并行函数调用