我有这个例子 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/