【问题标题】:Selecting rows with lowest values based on combination two columns from pandas根据 pandas 的两列组合选择具有最低值的行
【发布时间】:2018-09-03 20:03:07
【问题描述】:

我什至不确定标题是否有意义。

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

       x      y    time
0     225     0  20.295270
1     225     1  21.134015
2     225     2  21.382298
3     225     3  20.704367
4     225     4  20.152735
5     225     5  19.213522
.......
900   437   900  27.748966
901   437   901  20.898460
902   437   902  23.347935
903   437   903  22.011992
904   437   904  21.231041
905   437   905  28.769945
906   437   906  21.662975
.... and so on

我想要做的是检索那些与 x 和 y 关联的时间最短的行。基本上对于 y 上的每个元素,我想找到具有最小时间值的,但我想排除那些时间为 0.0 的元素。当 x 与 y 具有相同的值时,就会发生这种情况。

因此,例如,到达 y-0 的最快方法是从 x-225 开始,依此类推,因此可能会出现 x 重复自身但针对不同 y 的情况。

e.g. 
x      y    time
225     0  20.295270
438     1  19.648954
27     20   4.342732
9     438  17.884423
225   907  24.560400

到目前为止,我一直在尝试 groupby,但得到的 x 与 y 相同。

print(df.groupby('id_y', sort=False)['time'].idxmin())

y
0        0
1        1
2        2
3        3
4        4

下面的只是返回我已经拥有的df。

df.loc[df.groupby("id_y")["time"].idxmin()]

只是指出一件事,我愿意接受选择,而不仅仅是 groupby,如果还有其他非常好的方法。

【问题讨论】:

  • 我认为需要按x 列分组,而不是y,对吧?
  • 不,我需要 y,而不是 x。我已经解决了x。我想为 y 列中的每个元素检索基于 x 的最小时间。

标签: python pandas min pandas-groupby


【解决方案1】:

因此需要先删除 time 等于 boolean indexing 的行,然后使用您的解决方案:

df = df[df['time'] != 0]
df2 = df.loc[df.groupby("y")["time"].idxmin()]

query 过滤器的类似替代方案:

df = df.query('time != 0')
df2 = df.loc[df.groupby("y")["time"].idxmin()]

或将sort_values 与drop_duplicates 一起使用:

df2 = df[df['time'] != 0].sort_values(['y','time']).drop_duplicates('y')

【讨论】:

  • 我很确定'y'上的分组是我需要的。
  • @Geosphere - 好的,解决方案已更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 2016-03-18
  • 1970-01-01
  • 1970-01-01
  • 2021-04-26
  • 2021-09-11
  • 1970-01-01
相关资源
最近更新 更多