Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫为成对的行计算最小值_Python_Pandas_Dataframe - Fatal编程技术网

Python 熊猫为成对的行计算最小值

Python 熊猫为成对的行计算最小值,python,pandas,dataframe,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

我有以下数据帧:

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()
但我对索引有问题


有人有主意吗?谢谢。

我想你在找这个:

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

尝试使用

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
在一行代码中:

df.col2.diff.abs.shift-1[::2].agg['idxmin','min'].values.tolist 它返回一个包含以下内容的列表:

与具有最小绝对差的序列A-B的开始对应的行的索引; 绝对差值的值。 以下是输出:

[4.0, 0.5]
要解决您所问的索引问题,请使用.loc和比较表达式作为行索引器,使用'col2'作为列索引器。我已经添加了一个类型,以便稍后启用数学

>>> 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
要减去结果数据帧,请像“A”数据帧一样重新索引“B”数据帧,以确保可以恢复“A”行的原始索引

提取您正在寻找的内容

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

不幸的是,它不是一行。

您好。这有点不清楚,在这种情况下,这分别是0.5和4。。你能解释一下吗?您是否希望分配给“A”或“B”的值之间存在差异,而不管它们的行是什么?从您的代码中,我了解到您希望计算由两个子集A和B之间的绝对差组成的数组的最小值。它返回索引5,但返回的是正确的最小差
>>> z.abs().agg(['min', 'idxmin'])
min       0.5
idxmin    4.0
Name: col2, dtype: float64
>>>