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