我有以下数据框:
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()
但是我的索引有问题。
有人有想法吗?谢谢。
答案 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
>>>
不幸的是,它不是单线。