gpt4 book ai didi

python - 如何在 pandas 的多列和多行上选择具有条件的值(最佳实践)

转载 作者:太空宇宙 更新时间:2023-11-03 14:36:40 24 4
gpt4 key购买 nike

我想根据多列多行的条件从 Pandas 数据框中的一列中选择(唯一)值。考虑以下示例数据框:

df = pd.DataFrame({'Developer': ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'],
'Language': ['Java', 'Python', 'Python', 'Java', 'Python', 'Python', 'Java', 'Python', 'C++'],
'Skill_Level': [1, 3, 3, 3, 2, 3, 3, 1, 3],
'Version': ["x.x", "2.x", "3.x", "x.x", "2.x", "3.x", "x.x", "3.x", "x.x"]
})
    Developer    Language    Skill_Level    Version
0 A Java 1 x.x
1 A Python 3 2.x
2 A Python 3 3.x
3 B Java 3 x.x
4 B Python 2 2.x
5 B Python 3 3.x
6 C Java 3 x.x
7 C Python 1 3.x
8 C C++ 3 x.x

现在我想找到所有了解 Java 且技能水平至少为 3 并且还了解 Python(无论哪个版本)且技能水平至少为 2 的开发人员。

我现在解决它的方法是根据 Java 条件选择一组,根据 Python 条件选择另一组,然后进行内部合并以获得匹配所有条件的开发人员组:

result_java_df = df[(df["Language"] == "Java") & (df["Skill_Level"] >= 3)][["Developer"]]
result_python_df = df[(df["Language"] == "Python") & (df["Skill_Level"] >= 2)][["Developer"]]
result_df = result_java_df.merge(result_python_df, on="Developer")
result_df = result_df.drop_duplicates()
    Developer
0 B

是否有更“优雅”的方式来做到这一点?我觉得我忽略了某事。特别是如果我想根据更多基于行的条件进行选择(例如,选择在特定技能水平上了解 4 种语言的开发人员),这将变得非常复杂,当然,编写一个函数来处理此类选择是合理的。因此,我想知道 pandas 是否以某种方式支持此功能,但我只是没有找到该功能。

最佳答案

当我跑的时候

    qualified=    df.groupby("Developer").apply(
lambda x:
any(
(x.Language == "Java") &
(x.Skill_Level >=3)
) &
any(
(x.Language == "Python") &
(x.Skill_Level >= 2))
)

我得到了

Developer
A False
B True
C False
dtype: bool

然后您可以使用各种方法进行子集化,例如

[developer for developer,status in qualified.items() if status]

(返回一个列表)

qualified[qualified]

(返回一个系列)

如果你想让它更通用,你可以这样做:

minimum_skill_levels = {"Java":3,
"Python":2}

qualified= df.groupby("Developer").apply(
lambda x:
all([any(
(x.Language == Language)&
(x.Skill_Level >= Skill_Level)
)
for Language, Skill_Level in minimum_skill_levels.items()
])
)

关于python - 如何在 pandas 的多列和多行上选择具有条件的值(最佳实践),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57612658/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com