Die*_*ego 8 python top-n dataframe python-2.7 pandas
给定一个带有一个描述性列和X个数字列的数据框,对于每一行,我想识别具有较高值的前N列,并将其保存为新数据帧上的行.
例如,请考虑以下数据框:
df = pd.DataFrame()
df['index'] = ['A', 'B', 'C', 'D','E', 'F']
df['option1'] = [1,5,3,7,9,3]
df['option2'] = [8,4,5,6,9,2]
df['option3'] = [9,9,1,3,9,5]
df['option4'] = [3,8,3,5,7,0]
df['option5'] = [2,3,4,9,4,2]
Run Code Online (Sandbox Code Playgroud)
我想输出(假设N是3,所以我想要前三名):
A,option3
A,option2
A,option4
B,option3
B,option4
B,option1
C,option2
C,option5
C,option4 (or option1 - ties arent really a problem)
D,option5
D,option1
D,option2
and so on....
Run Code Online (Sandbox Code Playgroud)
任何想法如何轻松实现?谢谢
如果你只是想要配对:
from operator import itemgetter as it
from itertools import repeat
n = 3
# sort_values = order pandas < 0.17
new_d = (zip(repeat(row["index"]), map(it(0),(row[1:].sort_values(ascending=0)[:n].iteritems())))
for _, row in df.iterrows())
for row in new_d:
print(list(row))
Run Code Online (Sandbox Code Playgroud)
输出:
[('B', 'option3'), ('B', 'option4'), ('B', 'option1')]
[('C', 'option2'), ('C', 'option5'), ('C', 'option1')]
[('D', 'option5'), ('D', 'option1'), ('D', 'option2')]
[('E', 'option1'), ('E', 'option2'), ('E', 'option3')]
[('F', 'option3'), ('F', 'option1'), ('F', 'option2')]
Run Code Online (Sandbox Code Playgroud)
这也维持了秩序。
如果你想要一个列表的列表:
from operator import itemgetter as it
from itertools import repeat
n = 3
new_d = [list(zip(repeat(row["index"]), map(it(0),(row[1:].sort_values(ascending=0)[:n].iteritems()))))
for _, row in df.iterrows()]
Run Code Online (Sandbox Code Playgroud)
输出:
[[('A', 'option3'), ('A', 'option2'), ('A', 'option4')],
[('B', 'option3'), ('B', 'option4'), ('B', 'option1')],
[('C', 'option2'), ('C', 'option5'), ('C', 'option1')],
[('D', 'option5'), ('D', 'option1'), ('D', 'option2')],
[('E', 'option1'), ('E', 'option2'), ('E', 'option3')],
[('F', 'option3'), ('F', 'option1'), ('F', 'option2')]]
Run Code Online (Sandbox Code Playgroud)
或者使用 python 排序:
new_d = [list(zip(repeat(row["index"]), map(it(0), sorted(row[1:].iteritems(), key=it(1) ,reverse=1)[:n])))
for _, row in df.iterrows()]
Run Code Online (Sandbox Code Playgroud)
这实际上是最快的,如果你真的想要字符串,那么按照你想要的方式格式化输出是非常简单的。
| 归档时间: |
|
| 查看次数: |
1775 次 |
| 最近记录: |