pandas 我如何在一个嵌套框架上实现idxmax和随机抢七?

nfs0ujit  于 2023-11-15  发布在  其他
关注(0)|答案(5)|浏览(128)

如果我有一个这样的数组:
| ID| col1| col2| idxmax|
| --|--|--|--|
| 1 |3.0| 4.0| col2|
| 2 |5.0| 5.0|抢七|
| 3 |6.0版本|九点零|Col 2|
在我的示例中,我想根据赢得平局的名称返回col 1或col 2,不包括行ID。
目前,df.idxmax(axis = 1)函数只是返回第一个最大值的列的列名,根据文档。然而,为了确保消除偏见,我想把它变成一个随机平局打破,但我真的不知道如何做到这一点。
你能帮帮忙吗?

lvjbypge

lvjbypge1#

我喜欢@Timeless的随机抽样方法,问题是它总是对具有相同的最大值组合的不同行使用相同的平局决胜局。
另一种方法是先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

cczfrluj

cczfrluj2#

将每行与其 max 值匹配,以进一步随机np.random.choice列名:

df['idxmax'] = [np.random.choice(df.columns[r == m]) 
                for r, m in zip(df.values, df.max(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

nwlqm0z1

nwlqm0z13#

一个可能的选择是使用sampleshuffle 列顺序:

cols = df.sample(frac=1, axis=1).columns.difference(["id"], sort=False)
 
df["idxmax"] = df[cols].idxmax(axis=1)

字符串
输出量:

print(df)

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

j13ufse2

j13ufse24#

你的例子中的数组似乎有点错误,因为你在第一行中使用了col1作为idxmax,尽管col2中的值比col1中的值大(4 > 3)。然而,我认为这样的东西会给予你想要的结果:

import numpy as np
import pandas as pd

def randargmax(row):
    all_ties = [i for i, val in enumerate(row) if val == row.max()]
    return np.random.choice(all_ties)

df = pd.DataFrame({"col1": [3, 5, 6], "col2": [4, 5, 9]})
df["idxmax"] = [df.columns[randargmax(row)] for _, row in df.iterrows()]

print(df)

字符串

tf7tbtn2

tf7tbtn25#

对于每一行,找到最大值,找到包含它的单元格,然后得到它们的索引并随机选择。我不确定这是否可以矢量化,但至少使用apply很容易编写:

df.assign(idxmax=
    df.apply(lambda row: np.random.choice(row.index[row==row.max()]), axis=1)
)

字符串
输出示例:

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

相关问题