根据条件执行查询以获取行之间的差异

2024-09-27 09:24:03 发布

您现在位置: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)]

有没有办法让这更快


Tags: 数据类型dfindextypenpdiff价格
2条回答

在轴=1上尝试^{}+^{},然后^{}

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”值时才有效


^{}要按索引并排获取值,请执行以下操作:

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

^{}要清除不同时具有两个值的行,请执行以下操作:

type       C      P
index              
3000   300.0  500.0
3500   300.0  400.0

轴1上的^{}

type    C      P
index           
3000  NaN  200.0
3500  NaN  100.0

^{}以获取最后一列(其中差异累积)

index
3000    200.0
3500    100.0
Name: P, dtype: float64

^{}获取每个元素的绝对数值

^{}要获取最小值的索引:

3500

您可以使用groupby进行检查

inxout = df.sort_values('price').groupby('type')['price'].diff().idxmin()
2

相关问题 更多 >

    热门问题