我有一个这样的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并调用diffabs返回值对之间的绝对差,然后可以使用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/

10-12 22:42