从 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 Musketeers
或 Almond 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
我正在使用的示例数据集
df = pd.DataFrame({"competitorname": ["3 Musketeers", "Almond Joy"], "winpercent": [67.602936, 50.347546] }, index = [1, 2])
我正在尝试查看 3 Musketeers
或 Almond 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