如果我有这样的数据帧:

id col1 col2 idxmax
1 3.0 4.0 col2
2 5.0 5.0 tiebreak
3 6.0 9.0 col 2

在我的示例数据帧的情况下,我希望根据赢得平局的名称返回col1或col2.不包括行ID.

目前,根据文档,df.idxmax(axis = 1)函数只返回具有第一个最大值的列的列名.然而,为了确保消除偏见,我想把这变成一个随机的平局休息,但我真的不知道怎么做.

你能帮帮忙吗?

推荐答案

我喜欢@Timless的随机抽样方法,问题是它总是对具有相同相等最大值组合的不同行使用相同的平局决胜法.

另一种方法是先收集stack个数据:

df['idxmax'] = (df
   .drop(columns=['id', 'idxmax'], errors='ignore')
   .stack()
   .sample(frac=1)
   .groupby(level=0).idxmax().str[1]
)

或者:

cols = df.columns.difference(['id', 'idxmax'])

m = df[cols].eq(df[cols].max(axis=1), axis=0)

df['idxmax'] = (m[m].stack().reset_index(1)
                .groupby(level=0)['level_1'].sample(n=1)
               )

输出示例:

   id  col1  col2 idxmax
0   1   3.0   4.0   col2
1   2   5.0   5.0   col2
2   3   6.0   9.0   col2

Python相关问答推荐

在Docker中运行HAProxy时无法获得503服务

绘制系列时如何反转轴?

Python -Polars库中的滚动索引?

添加包含中具有任何值的其他列的计数的列

在Pandas 日历中插入一行

如何让剧作家等待Python中出现特定cookie(然后返回它)?

删除任何仅包含字符(或不包含其他数字值的邮政编码)的观察

如何访问所有文件,例如环境变量

如何设置视频语言时上传到YouTube与Python API客户端

所有列的滚动标准差,忽略NaN

有没有一种ONE—LINER的方法给一个框架的每一行一个由整数和字符串组成的唯一id?

mypy无法推断类型参数.List和Iterable的区别

计算分布的标准差

在Python 3中,如何让客户端打开一个套接字到服务器,发送一行JSON编码的数据,读回一行JSON编码的数据,然后继续?

Tkinter菜单自发添加额外项目

如何在BeautifulSoup/CSS Select 器中处理regex?

如何在Python请求中组合多个适配器?

使用__json__的 pyramid 在客户端返回意外格式

根据客户端是否正在传输响应来更改基于Flask的API的行为

无法在Spyder上的Pandas中将本地CSV转换为数据帧