gpt4 book ai didi

python - 将 .iterrows() 与 series.nlargest() 结合使用以获取 Dataframe 中一行中的最高数字

转载 作者:太空狗 更新时间:2023-10-30 02:07:22 24 4
gpt4 key购买 nike

我正在尝试创建一个使用 df.iterrows()Series.nlargest 的函数。我想遍历每一行并找到最大的数字,然后将其标记为 1。这是数据框:

A   B    C
9 6 5
3 7 2

这是我希望得到的输出:

A    B   C
1 0 0
0 1 0

这是我想在这里使用的功能:

def get_top_n(df, top_n):
"""


Parameters
----------
df : DataFrame

top_n : int
The top number to get
Returns
-------
top_numbers : DataFrame
Returns the top number marked with a 1

"""
# Implement Function
for row in df.iterrows():
top_numbers = row.nlargest(top_n).sum()

return top_numbers

我收到以下错误:AttributeError: 'tuple' 对象没有属性 'nlargest'

对于如何以更简洁的方式重写我的函数并实际工作,我们将不胜感激!提前致谢

最佳答案

添加i变量,因为iterrows为每一行返回带有 Series 的索引:

for i, row in df.iterrows():
top_numbers = row.nlargest(top_n).sum()

通用解决方案 numpy.argsort职位 descending order ,然后比较 bool 数组并将其转换为整数:

def get_top_n(df, top_n):
if top_n > len(df.columns):
raise ValueError("Value is higher as number of columns")
elif not isinstance(top_n, int):
raise ValueError("Value is not integer")

else:
arr = ((-df.values).argsort(axis=1) < top_n).astype(int)
df1 = pd.DataFrame(arr, index=df.index, columns=df.columns)
return (df1)

df1 = get_top_n(df, 2)
print (df1)
A B C
0 1 1 0
1 1 1 0

df1 = get_top_n(df, 1)
print (df1)
A B C
0 1 0 0
1 0 1 0

编辑:

iterrows 的解决方案是可能的,但不推荐,因为速度慢:

top_n = 2
for i, row in df.iterrows():
top = row.nlargest(top_n).index
df.loc[i] = 0
df.loc[i, top] = 1

print (df)
A B C
0 1 1 0
1 1 1 0

关于python - 将 .iterrows() 与 series.nlargest() 结合使用以获取 Dataframe 中一行中的最高数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51645934/

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