gpt4 book ai didi

python - 在 Pandas 数据框中找到最小值并在新列上添加标签

转载 作者:行者123 更新时间:2023-12-04 01:09:20 24 4
gpt4 key购买 nike

我可以对我的 python pandas 代码进行哪些改进以使其更高效?就我而言,我有这个数据框

In [1]: df = pd.DataFrame({'PersonID': [1, 1, 1, 2, 2, 2, 3, 3, 3],
'Name': ["Jan", "Jan", "Jan", "Don", "Don", "Don", "Joe", "Joe", "Joe"],
'Label': ["REL", "REL", "REL", "REL", "REL", "REL", "REL", "REL", "REL"],
'RuleID': [55, 55, 55, 3, 3, 3, 10, 10, 10],
'RuleNumber': [3, 4, 5, 1, 2, 3, 234, 567, 999]})

结果如下:

In [2]: df
Out[2]:
PersonID Name Label RuleID RuleNumber
0 1 Jan REL 55 3
1 1 Jan REL 55 4
2 1 Jan REL 55 5
3 2 Don REL 3 1
4 2 Don REL 3 2
5 2 Don REL 3 3
6 3 Joe REL 10 234
7 3 Joe REL 10 567
8 3 Joe REL 10 999

我在这里需要完成的是将 Label 列下的字段更新为 MAIN,以获得与应用于 Person ID 和 Name 的每个 Rule ID 关联的最低规则值。因此,结果需要如下所示:

In [3]: df
Out[3]:
PersonID Name Label RuleID RuleNumber
0 1 Jan MAIN 55 3
1 1 Jan REL 55 4
2 1 Jan REL 55 5
3 2 Don MAIN 3 1
4 2 Don REL 3 2
5 2 Don REL 3 3
6 3 Joe MAIN 10 234
7 3 Joe REL 10 567
8 3 Joe REL 10 999

这是我为此编写的代码:

In [4]:

df['Label'] = np.where(
df['RuleNumber'] ==
df.groupby(['PersonID', 'Name', 'RuleID'])['RuleNumber'].transform('min'),
"MAIN", df.Label)

有没有更好的方法来更新Label列下的值?我觉得我在强行通过,这可能不是最有效的方法。

我使用了以下 SO 线程来得出我的结果:

Replace column values within a groupby and condition

Replace values within a groupby based on multiple conditions

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.idxmin.html

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.transform.html

Using Pandas to Find Minimum Values of Grouped Rows

如有任何建议,我们将不胜感激。

谢谢。

最佳答案

似乎您可以按分组的 idxmin 进行过滤,而不管排序顺序如何,并基于此更新 RuleNumber。您可以使用 locnp.wheremaskwhere,如下所示:

df.loc[df.groupby(['PersonID', 'Name', 'RuleID'])['RuleNumber'].idxmin(), 'Label'] = 'MAIN'

或在您尝试时使用 np.where:

df['Label'] = (np.where((df.index == df.groupby(['PersonID', 'Name', 'RuleID'])
['RuleNumber'].transform('idxmin')), 'MAIN', 'REL'))
df
Out[1]:
PersonID Name Label RuleID RuleNumber
0 1 Jan MAIN 55 3
1 1 Jan REL 55 4
2 1 Jan REL 55 5
3 2 Don MAIN 3 1
4 2 Don REL 3 2
5 2 Don REL 3 3
6 3 Joe MAIN 10 234
7 3 Joe REL 10 567
8 3 Joe REL 10 999

使用 mask 或其逆 where 也可以:

df['Label'] = (df['Label'].mask((df.index == df.groupby(['PersonID', 'Name', 'RuleID'])
['RuleNumber'].transform('idxmin')), 'MAIN'))

df['Label'] = (df['Label'].where((df.index != df.groupby(['PersonID', 'Name', 'RuleID'])
['RuleNumber'].transform('idxmin')), 'MAIN'))

关于python - 在 Pandas 数据框中找到最小值并在新列上添加标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65347497/

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