我有一个像这样的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'
的情况。
Pandas可以轻易实现吗?
答案 0 :(得分:2)
IIUC然后你可以在'a'上groupby
并调用diff
和abs
来返回值对之间的绝对差异,然后可以使用{{3}获取索引}}:
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
值的情况,您必须将其过滤掉,基本上执行双组:
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