【问题标题】:How can I get the index of smallest value in Series?如何获得系列中最小值的索引?
【发布时间】:2021-07-04 05:39:13
【问题描述】:

我的 DataFrame 包含 4 列:City、District、Area 和 Price,其中 Area 是 float64,Price 是 int64。

price_min = df['Price'].min()
# area_min = df['Area'].iloc[np.nanargmin(df['Price'])]
# city_min = df['City'].iloc[np.nanargmin(df['Price'])]
area_min = df['Area'].iloc[df['Price'].idxmin()]
city_min = df['City'].iloc[df['Price'].idxmin()]
print(
    f"If you are looking for a cheap accommodation, "
    f"a {area_min} m² apartment for {price_min} PLN is available in {city_min}"

)

注释行确实有效。 但是下面的行会导致错误:

result = values.argmin(axis)
TypeError: argmin() takes 1 positional argument but 2 were given

为什么它不起作用?

【问题讨论】:

  • 发布完整的错误回溯。传递索引时不应使用.iloc,请使用.loc

标签: python pandas dataframe numpy series


【解决方案1】:

使用DataFrame.loc,因为DataFrame.iloc 用于按位置选择,而不是按标签:

df = pd.DataFrame({
        'City':list('abcdef'),
         'District':list('GHIJKL'),
         'Area':[7,8,9,4,2,3],
         'Price':[271,34,55,74,10,120],

})
print (df)

  City District  Area  Price
0    a        G     7    271
1    b        H     8     34
2    c        I     9     55
3    d        J     4     74
4    e        K     2     10
5    f        L     3    120


#for default index values
df = df.reset_index(drop=True)

price_min = df['Price'].min()
area_min = df.loc[df['Price'].idxmin(), 'Area']
city_min = df.loc[df['Price'].idxmin(), 'City']
    
print(
    f"If you are looking for a cheap accommodation, "
    f"a {area_min} m² apartment for {price_min} PLN is available in {city_min}"

)
If you are looking for a cheap accommodation, a 2 m² apartment for 10 PLN is available in e

【讨论】:

  • @FilipSzczybura - 你的熊猫版本是什么?
  • 我目前的版本是1.2.3
【解决方案2】:

试试这个:

area_min = df.loc[df['Price'].idxmin()][['Area']]
city_min = df.loc[df['Price'].idxmin()][['City']]

【讨论】:

  • 问题是.iloc不是按索引值选择的,而是使用位置选择的。正如@jezrael 在他的回答中提到的那样。
  • 同样的错误。我使用 df['Price'].values.argmin() 解决了它,但我认为这是一种更简单的解决方法
  • @FilipSzczybura 因为.argmin 给出了最小值的位置,而.idxmin() 给出了对应于最小值的索引。我们应该将位置传递给.iloc,因此.argmin 可以正常工作,但.idxmin 不行。
  • 但为什么我需要 .values 属性?我认为它应该适用于单个 argmin/idxmin
  • AFAIK.argmin 在 pandas 系列中不存在,它是一个 numpy 函数。 .valuesseries 转换为 numpy 数组,然后我们可以使用 .argmin
猜你喜欢
  • 2020-03-11
  • 2021-10-28
  • 1970-01-01
  • 2012-09-09
  • 2019-06-06
  • 1970-01-01
  • 2015-08-18
  • 1970-01-01
  • 2014-07-09
相关资源
最近更新 更多