熊猫计算行对的最小值

时间:2021-01-31 15:15:01

标签: python pandas dataframe

我有以下数据框:

data = {'col1': ['A', 'B', 'A', 'B', "A", "B"], 
        'col2': ["0", "2", "0", "1", "0", "0.5"]}  
df = pd.DataFrame.from_dict(data)

df 

   col1 col2
0   A   0
1   B   2
2   A   0
3   B   1
4   A   0
5   B   0.5

有三对行 (A,B)。对于每一对,我计算 col2 中数字的绝对差。我的目标是得到三对和对应索引的最小绝对差。在这种情况下,分别为 0.5 和 4。

我已经试过了:

(df[df["col1"] == "A"]["col2"] - df[df["col1"] == "B"]["col2"]).abs().min()

但是我的索引有问题。

有人有想法吗?谢谢。

4 个答案:

答案 0 :(得分:3)

试试

s = df.iloc[::-1].groupby(df.index//2).col2.diff().abs()
out = s.agg(['min','idxmin'])
Out[193]: 
min       0.5
idxmin    4.0
Name: col2, dtype: float64

答案 1 :(得分:1)

我认为您正在寻找这个:

import numpy as np
df.loc[:,'col2'] = df.col2.astype(np.float)
df[(df.col2 == min(df[df.col2 > 0].col2)) ]

正确吗?

答案 2 :(得分:1)

一行代码:

df.col2.diff().abs().shift(-1)[::2].agg(['idxmin', 'min']).values.tolist()

它返回一个列表:

  • 具有最小绝对差值的序列A-B开头对应的行的索引;
  • 绝对差值。

这里的输出:

[4.0, 0.5]

答案 3 :(得分:1)

要解决您询问的索引问题,请将 .loc 与比较表达式一起用作行索引器,将 'col2' 用作列索引器。我添加了 astype 以便稍后启用数学运算。

>>> x = df.loc[df.col1=='A','col2'].astype(float)
>>> y = df.loc[df.col1=='B','col2'].astype(float)
>>> x
0    0.0
2    0.0
4    0.0
Name: col2, dtype: float64
>>> y
1    2.0
3    1.0
5    0.5
Name: col2, dtype: float64

要减去生成的 DataFrame,像 'B' DataFrame 一样重新索引 'A' DataFrame,以确保您可以恢复 'A' 行的原始索引。

>>> z = x - y.reindex_like(x,method='bfill')
>>> z
0   -2.0
2   -1.0
4   -0.5
Name: col2, dtype: float64

提取您要查找的内容。

>>> z.abs().agg(['min', 'idxmin'])
min       0.5
idxmin    4.0
Name: col2, dtype: float64
>>>

不幸的是,它不是单线。