我有一个这样的Pandas数据框:
a b
1 4.5
1 5.1
2 6.2
2 6.4
3 7.1
3 3.2
4 0
4 0
对于每个
'a'
值,有两个数据帧行。我想获得'a'
值,其中abs(b1-b2)
最小。编辑:另外,我想忽略两个'a'
条目都具有'b=0'
的情况。用熊猫很容易做到吗?
最佳答案
IIUC,然后您可以在'a'上groupby
并调用diff
和abs
返回值对之间的绝对差,然后可以使用idxmin
获取索引:
In [127]:
df.loc[df.groupby('a')['b'].diff().abs().idxmin()]
Out[127]:
a 2.0
b 6.4
Name: 3, dtype: float64
中间步骤和输出为:
In [128]:
df.groupby('a')['b'].diff()
Out[128]:
0 NaN
1 0.6
2 NaN
3 0.2
4 NaN
5 -3.9
dtype: float64
In [129]:
df.groupby('a')['b'].diff().abs()
Out[129]:
0 NaN
1 0.6
2 NaN
3 0.2
4 NaN
5 3.9
dtype: float64
In [130]:
df.groupby('a')['b'].diff().abs().idxmin()
Out[130]:
3
编辑
要处理具有2个
0
值的情况,您必须将其过滤掉,本质上是执行double groupby:In [157]:
df.loc[df[df['a'].isin(df.loc[df.groupby('a')['b'].diff().abs() > 0,'a'])].groupby('a')['b'].diff().abs().idxmin()]
Out[157]:
a 2.0
b 6.4
Name: 3, dtype: float64
关于python - 获取行a,其中差异行b_1减去行b_2最小,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35434133/