在每个 pandas 数据帧行中查找前 n 个最高值(非零)列的名称
Find names of top-n highest-value (non-zero) columns in each pandas dataframe row
假设我有像
这样的数据框
id p1 p2 p3 p4
1 0 9 0 4
2 0 0 0 4
3 1 3 10 7
4 1 5 3 1
5 2 3 7 10
想要在每个 pandas 数据框行中找到前 n 个最高值列的列名,并希望从前 3 个中排除零值。
id top1 top2 top3
1 p2 p4
2 p4
3 p3 p4 p2
4 p2 p3 p4/p1
5 p4 p3 p2
目前的解决方案 return 列名称也为零。有没有办法排除零值。有这个解决方案
arank = df.apply(np.argsort, axis = 1)
ranked_cols = df.columns.to_series()[arank.values[:,::-1][:,:3]]
new_df = pd.DataFrame(ranked_cols, index=df.index)
还有其他解决方案,例如。可以修改这些以排除具有零值的列吗?
您需要将 values by column names
, and where 0
replace by mask
重新排序为空字符串:
df = df.set_index('id')
k = 3
vals = df.values
arr1 = np.argsort(-vals, axis=1)
print (vals[np.arange(len(df.index))[:,None], arr1][:,:k])
[[ 9 4 0]
[ 4 0 0]
[10 7 3]
[ 5 3 1]
[10 7 3]]
a = df.columns[arr1[:,:k]]
mask = vals[np.arange(len(df.index))[:,None], arr1][:,:k] == 0
print (mask)
[[False False True]
[False True True]
[False False False]
[False False False]
[False False False]]
result = pd.DataFrame(a, columns=['top{}'.format(i) for i in range(1, k+1)],
index=df.index)
result = result.mask(mask, '')
print(result)
top1 top2 top3
id
1 p2 p4
2 p4
3 p3 p4 p2
4 p2 p3 p1
5 p4 p3 p2
假设我有像
这样的数据框id p1 p2 p3 p4
1 0 9 0 4
2 0 0 0 4
3 1 3 10 7
4 1 5 3 1
5 2 3 7 10
想要在每个 pandas 数据框行中找到前 n 个最高值列的列名,并希望从前 3 个中排除零值。
id top1 top2 top3
1 p2 p4
2 p4
3 p3 p4 p2
4 p2 p3 p4/p1
5 p4 p3 p2
目前的解决方案 return 列名称也为零。有没有办法排除零值。有这个解决方案
arank = df.apply(np.argsort, axis = 1)
ranked_cols = df.columns.to_series()[arank.values[:,::-1][:,:3]]
new_df = pd.DataFrame(ranked_cols, index=df.index)
还有其他解决方案,例如
您需要将 values by column names
, and where 0
replace by mask
重新排序为空字符串:
df = df.set_index('id')
k = 3
vals = df.values
arr1 = np.argsort(-vals, axis=1)
print (vals[np.arange(len(df.index))[:,None], arr1][:,:k])
[[ 9 4 0]
[ 4 0 0]
[10 7 3]
[ 5 3 1]
[10 7 3]]
a = df.columns[arr1[:,:k]]
mask = vals[np.arange(len(df.index))[:,None], arr1][:,:k] == 0
print (mask)
[[False False True]
[False True True]
[False False False]
[False False False]
[False False False]]
result = pd.DataFrame(a, columns=['top{}'.format(i) for i in range(1, k+1)],
index=df.index)
result = result.mask(mask, '')
print(result)
top1 top2 top3
id
1 p2 p4
2 p4
3 p3 p4 p2
4 p2 p3 p1
5 p4 p3 p2