从 Pandas 中选择值而不经过 .values[0]

Selecting value from Pandas without going through .values[0]

我正在使用的示例数据集

df = pd.DataFrame({"competitorname": ["3 Musketeers", "Almond Joy"], "winpercent": [67.602936, 50.347546] }, index = [1, 2])

我正在尝试查看 3 MusketeersAlmond Joy 是否具有更高的 winpercent。我写的代码是:

more_popular = '3 Musketeers' if df.loc[df["competitorname"] == '3 Musketeers', 'winpercent'].values[0] > df.loc[df["competitorname"] == 'Almond Joy', 'winpercent'].values[0] else 'Almond Joy'

我的问题是

我可以 select 我感兴趣的值而不 python return 系列吗?有没有办法做到

df[df["competitorname"] == 'Almond Joy', 'winpercent']

然后return一个简单的

50.347546

?

我知道这不会使我的代码显着缩短,但我觉得我缺少从 pandas 获取值的一些东西,这将帮助我避免不断添加

.values[0]

如何简单地按“winpercent”对数据帧进行排序,然后取顶行?

df.sort_values(by="winpercent", ascending=False, inplace=True)

然后查看获胜者行

df.head(1)

或获取值

df.iloc[0]["winpercent"]

潜在的问题是可能有多个匹配项,因此我们总是需要在管道中的某个点提取匹配项:

  • 在布尔掩码上使用 Series.idxmax

    因为 False 是 0 而 True 是 1,在布尔掩码上使用 Series.idxmax 会给你第一个 True 的索引:

    df.loc[df['competitorname'].eq('Almond Joy').idxmax(), 'winpercent']
    # 50.347546
    

    这假定至少有 1 个 True 匹配项,否则它将 return 第一个 False

  • 或对结果使用Series.item

    这基本上只是 Series.values[0] 的别名:

    df.loc[df['competitorname'].eq('Almond Joy'), 'winpercent'].item()
    # 50.347546
    

    这假定恰好有 1 个 True 匹配项,否则会抛出 ValueError。

如果您确定返回的系列只有一个元素,您可以简单地使用 .item() 来获取它:

import pandas as pd
df = pd.DataFrame({
    "competitorname": ["3 Musketeers", "Almond Joy"], 
    "winpercent": [67.602936, 50.347546]
}, index = [1, 2])

s = df.loc[df["competitorname"] == 'Almond Joy', 'winpercent']  # a pandas Series
print(s)
# output
# 2    50.347546
# Name: winpercent, dtype: float64

v = df.loc[df["competitorname"] == 'Almond Joy', 'winpercent'].item()  # a scalar value
print(v)
# output
# 50.347546