che*_*ens 9 python top-n dataframe pandas
我有以下数据帧:
id p1 p2 p3 p4
1 0 9 1 4
2 0 2 3 4
3 1 3 10 7
4 1 5 3 1
5 2 3 7 10
Run Code Online (Sandbox Code Playgroud)
我需要以一种方式重塑数据框,对于每个id,它将具有最高值的前3列.结果将是这样的:
id top1 top2 top3
1 p2 p4 p3
2 p4 p3 p2
3 p3 p4 p2
4 p2 p3 p4/p1
5 p4 p3 p2
Run Code Online (Sandbox Code Playgroud)
它显示了每个最畅销的前3名user_id
.我已经使用dplyr
R中的包完成了它,但我正在寻找等效的pandas.
unu*_*tbu 16
您可以使用np.argsort
查找每行n个最大项的索引:
import numpy as np
import pandas as pd
df = pd.DataFrame({'id': [1, 2, 3, 4, 5],
'p1': [0, 0, 1, 1, 2],
'p2': [9, 2, 3, 5, 3],
'p3': [1, 3, 10, 3, 7],
'p4': [4, 4, 7, 1, 10]})
df = df.set_index('id')
nlargest = 3
order = np.argsort(-df.values, axis=1)[:, :nlargest]
result = pd.DataFrame(df.columns[order],
columns=['top{}'.format(i) for i in range(1, nlargest+1)],
index=df.index)
print(result)
Run Code Online (Sandbox Code Playgroud)
产量
top1 top2 top3
id
1 p2 p4 p3
2 p4 p3 p2
3 p3 p4 p2
4 p2 p3 p1
5 p4 p3 p2
Run Code Online (Sandbox Code Playgroud)
您可以使用:
df = df.set_index('id').apply(lambda x: pd.Series(x.sort_values(ascending=False)
.iloc[:3].index,
index=['top1','top2','top3']), axis=1).reset_index()
print (df)
id top1 top2 top3
0 1 p2 p4 p3
1 2 p4 p3 p2
2 3 p3 p4 p2
3 4 p2 p3 p4
4 5 p4 p3 p2
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4686 次 |
最近记录: |