首页 > 解决方案 > 慢熊猫查询以根据条件在行之间获取差异

问题描述

我有一个大数据框作为输入,如下所示:

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)]

有没有办法让它更快?

标签: pythonpandasnumpy

解决方案


在axis = 1上尝试pivot+ ,然后:diffidxmin

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

推荐阅读