python - nlargest(2) 在行级别检索列名称和相等值

标签 python python-3.x pandas numpy

我有这个例子 df:

df = pd.DataFrame({
                  'Name': ['Sara', 'Adam','Ciara', 'John','Paul'],
                  'UK': [1,2,0,4,2],
                  'US': [1,3,0,1,2],
                  'IN': [1,5,0,1,0],
                  'CA': [0,0,0,7,1],
                  'JP': [0,0,0,0,1]
                   })

df

给予:

    Name    UK  US  IN  CA  JP
0   Sara    1   1   1   0   0
1   Adam    2   3   5   0   0
2   Ciara   0   0   0   0   0
3   John    4   1   1   7   0
4   Paul    2   2   0   1   1

我想获取每行访问量最高的 2 个国家/地区(列名称),有些行全部为 0,其他行可能有相同的数字 1,1,1 >

我已经开始得到一些结果,但输出并不符合预期:

io = df[['UK','US','IN','CA','JP']] #getting only countries columns as a df

然后

pd.DataFrame({n: io.T[col].astype(int).nlargest(2).index.tolist() for n, col in enumerate(io.T)}).T.join(df)

这就是我得到的:

    0   1   Name    UK  US  IN  CA  JP
0   UK  US  Sara    1   1   1   0   0
1   IN  US  Adam    2   3   5   0   0
2   UK  US  Ciara   0   0   0   0   0
3   CA  UK  John    4   1   1   7   0
4   UK  US  Paul    2   2   0   1   1

对于第一行 UK,US,IN 列都具有相同的值,因此我很困惑如何处理相同的结果以及 nlargest(2) 如何选择 US,UK 而不是IN

由于 nlargest(2) 不适用于关系,我想包含所有列名称

对于所有 0,0,0,0,0 的第三行,它仍然显示 UK,US 我尝试将所有 0 转换为 NaN,但得到了很多错误

这是预期输出的示例 - 第一行是关系的示例:

    0   1   2       Name    UK  US  IN  CA  JP
0   UK  US  IN      Sara    1   1   1   0   0
1   IN  US  0       Adam    2   3   5   0   0
2   0   0   0       Ciara   0   0   0   0   0
3   CA  UK  0       John    4   1   1   7   0
4   UK  US  0       Paul    2   2   0   1   1

最佳答案

这是一个未经修饰的答案,其中包含点积和沿 axis=1 的排名

tmp = df.set_index("Name")
out = (pd.DataFrame(tmp.rank(axis=1,ascending=False).le(2).dot(tmp.columns+',')
                    .str.split(",")
                    .to_list()).iloc[:,:-1]
      .replace('',np.nan))

print(out)

     0     1     2
0   UK    US    IN
1   US    IN   NaN
2  NaN  None  None
3   UK    CA   NaN
4   UK    US   NaN

关于python - nlargest(2) 在行级别检索列名称和相等值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72718471/

相关文章:

php - 在 Python 中解码复杂的 JSON

Python:循环连续的字符?

python - 用于排列数据框的聚合函数

python - 如何根据Python中的pandas多维数据帧的未标记第一列选择行?

python - 按子字符串标准过滤 pandas DataFrame

python - 绘制和更新车速表指针

python - python装饰器函数流程

python - 分类数据的矢量量化

python-3.x - 为什么这次迭代没有更新计数?

Python - 仅向列表添加一次