Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.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_Conditional - Fatal编程技术网

Python 选择数据框中具有最接近值的行

Python 选择数据框中具有最接近值的行,python,pandas,conditional,Python,Pandas,Conditional,我想为每个组选择一行,条件如下: 选择最接近15的B值在02:00:00的情况下,最接近15的值为14。 如果有两个最接近15的值,则在01:00:00选择18的情况下,选择其中的较大值。 输出应为: A B C 0 01:00:00 24 Andrew 1 01:00:00 28 Edd 2 01:00:00 12 Emma 3 01:00:00 18 Fred 4 02:00:00 17 Andrew 5 02

我想为每个组选择一行,条件如下:

选择最接近15的B值在02:00:00的情况下,最接近15的值为14。 如果有两个最接近15的值,则在01:00:00选择18的情况下,选择其中的较大值。 输出应为:

          A   B       C
0  01:00:00  24  Andrew
1  01:00:00  28     Edd
2  01:00:00  12    Emma
3  01:00:00  18    Fred
4  02:00:00  17  Andrew
5  02:00:00  35     Edd
6  02:00:00  45    Emma
7  02:00:00  14    Fred

另一种解决方案是创建辅助列,对值进行排序并删除重复项:

          A   B       C
3  01:00:00  18    Fred
7  02:00:00  14    Fred
df.iloc[np.lexsort(
    [-df.B, df.B.sub(15).abs()]
)].groupby('A').head(1)

          A   B     C
3  01:00:00  18  Fred
7  02:00:00  14  Fred

其思想是,您可以按元组列D按每个元素以升序方式连续排序,因为在Python中元组就是这样排序的。

另一种解决方案是创建辅助列,对值进行排序并删除重复项:

          A   B       C
3  01:00:00  18    Fred
7  02:00:00  14    Fred
df.iloc[np.lexsort(
    [-df.B, df.B.sub(15).abs()]
)].groupby('A').head(1)

          A   B     C
3  01:00:00  18  Fred
7  02:00:00  14  Fred
其思想是,您可以按元组列D按每个元素以升序方式连续排序,因为在Python中元组就是这样排序的。

这里的groupby是特殊情况,如果有两个最接近15的值,请选择其中较大的一个

此处的groupby是特殊情况下的结果,如果有两个最接近15的值,请选择其中较大的一个

与敏和关键的乐趣 np.lexsort怎么样 与敏和关键的乐趣 np.lexsort怎么样
我们可以使用abs和15.1,这将确保16比14更接近,以此类推

重新索引和删除重复项:

          A   B       C
3  01:00:00  18    Fred
7  02:00:00  14    Fred
df.iloc[np.lexsort(
    [-df.B, df.B.sub(15).abs()]
)].groupby('A').head(1)

          A   B     C
3  01:00:00  18  Fred
7  02:00:00  14  Fred
或者,对于iloc和2行,还添加了一个排序回功能,以获取最短时间

df = df.reindex((df['B']-15.1).abs().sort_values().index).drop_duplicates('A')
print(df)

          A   B     C
7  02:00:00  14  Fred
3  01:00:00  18  Fred

我们可以使用abs和15.1,这将确保16比14更接近,以此类推

重新索引和删除重复项:

          A   B       C
3  01:00:00  18    Fred
7  02:00:00  14    Fred
df.iloc[np.lexsort(
    [-df.B, df.B.sub(15).abs()]
)].groupby('A').head(1)

          A   B     C
3  01:00:00  18  Fred
7  02:00:00  14  Fred
或者,对于iloc和2行,还添加了一个排序回功能,以获取最短时间

df = df.reindex((df['B']-15.1).abs().sort_values().index).drop_duplicates('A')
print(df)

          A   B     C
7  02:00:00  14  Fred
3  01:00:00  18  Fred

很抱歉我的密码有错。编辑:对不起。我的密码有错。编辑在我不需要第二个条件的情况下,如果有两个最接近15的值,请选择其中的较大值;答案是什么?程序会选择两个值中的哪一个?如果有两个最接近15的值,我不需要第二个条件,请选择其中较大的一个;答案是怎样的?程序会选择两个值中的哪一个?非常令人沮丧,OP中途改变了他们的问题。好在我没有注意到,直到它太晚了-:非常令人沮丧,OP中途改变了他们的问题。好在我没有注意到,直到它太晚了-: