【问题标题】:Pandas Dataframe - find the row with minimum value based on two columns but greater than 0Pandas Dataframe - 根据两列找到最小值但大于0的行
【发布时间】:2018-03-25 04:13:12
【问题描述】:

我有一个包含 3 列的数据框:x、y、时间。有几千行。

我想要做的是检索具有最短时间的行,但我希望最小值不应该是 0。

例如

x     y    time
240   1    28.5
240   2    19.3
240   240     0
240   19    9.7

到目前为止,我尝试过的方法如下:

df.loc[df['time'] > 0].min()
# this gives me a series and I want a row
# x    225.000000
# y      0.000000
# time   1.066606

df['time'].drop_duplicates().nsmallest(1)
# 225    0.0

我也尝试过使用 groupby 的方法

df.loc[df.groupby('id_x', sort=False)['time'].idxmin()]

我知道在对这个进行子集化时遇到问题,因为我通常有一个系列。

【问题讨论】:

  • 感谢大家的帮助!那速度非常快。

标签: python pandas


【解决方案1】:

试试这个:

In [69]: df.loc[df.time>0, 'time'].idxmin()
Out[69]: 3

In [72]: df.loc[[df.loc[df.time>0, 'time'].idxmin()]]
Out[72]:
     x   y  time
3  240  19   9.7

【讨论】:

  • 效果也不错,第二个是我想要的,我相信第一个选项给了我该行的位置/索引。
  • @Geosphere 不要使用 groupby。这个解决方案真的是最好的。
  • 确实,不需要 groupby。这只会让事情变得更复杂。
【解决方案2】:

你可以通过query过滤掉0的值,通过idxmin得到最小值的索引,最后通过loc选择:

s = df.loc[df.query('time != 0')['time'].idxmin()]
print (s)
x       240.0
y        19.0
time      9.7
Name: 3, dtype: float64

df = df.loc[[df.query('time != 0')['time'].idxmin()]]
print (df)
     x   y  time
3  240  19   9.7

【讨论】:

  • @Geosphere - 我再次检查您的问题并删除groupby 解决方案,因为这里更好:)
【解决方案3】:

你根本不需要groupby。这是mask/where + loc + idxmin 的选项;

df.loc[[df.time.mask(df.time.eq(0)).idxmin()]]

或者,

df.loc[[df.time.where(df.time.ne(0)).idxmin()]]

     x   y  time
3  240  19   9.7

【讨论】:

  • 问题是我想检索一行,而不是一个系列。但与我之前得到错误答案的尝试相比,它确实给了我一个准确的答案。我以前没有尝试过使用面具,所以有趣的解决方案。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-21
  • 2016-10-06
  • 2017-12-23
相关资源
最近更新 更多