我有1000x1000矩阵(浮点数)作为数据帧。列和行为0-1000。对于每一行,我想要前10个最高值及其索引信息。事实证明这比起初的想法更难:
for row, index in df.iterrows():
temp_row = row.copy()
sort_row = temp_row.sort()
# somehow I want indices as well
如果我可以稍后通过其他方法或直接索引获取值,也可以找到前10个索引。
答案 0 :(得分:2)
方法1
将输出与输入数据帧的大小相同,只有前10个值将存在,并且值的重置将为null,因此保留每列的前10个值的索引。
In [2]: import pandas as pd
In [3]: import numpy as np
In [4]: df = pd.DataFrame(np.random.rand(100,100))
In [5]: out = df.apply(lambda x: x.sort_values(ascending=False).head(10), axis=0)
In [6]: out
Out[6]:
0 1 2 3 4 5 6 \
0 NaN NaN NaN NaN NaN NaN NaN
1 NaN NaN NaN NaN NaN NaN NaN
2 NaN NaN NaN NaN NaN NaN NaN
3 0.884964 NaN NaN NaN NaN NaN NaN
4 NaN NaN NaN NaN NaN NaN NaN
5 NaN NaN NaN NaN 0.950102 NaN NaN
6 NaN NaN NaN NaN NaN NaN NaN
7 NaN NaN NaN NaN NaN 0.990906 NaN
8 NaN NaN NaN NaN NaN NaN NaN
9 NaN NaN NaN NaN NaN NaN 0.953309
10 NaN NaN 0.932619 NaN NaN NaN NaN
11 NaN NaN NaN NaN NaN NaN 0.930249
12 NaN 0.907756 NaN NaN NaN NaN NaN
13 NaN NaN NaN NaN NaN NaN NaN
14 NaN NaN NaN NaN NaN NaN NaN
15 NaN NaN NaN NaN NaN 0.947548 NaN
16 0.952427 NaN NaN 0.933285 NaN NaN NaN
17 NaN NaN NaN NaN NaN NaN NaN
18 0.908944 NaN NaN NaN NaN 0.944756 NaN
19 NaN NaN NaN NaN NaN NaN NaN
20 NaN NaN NaN NaN NaN NaN NaN
21 NaN NaN NaN NaN NaN NaN NaN
22 NaN NaN NaN NaN NaN NaN 0.936263
23 NaN NaN NaN NaN 0.959198 NaN NaN
24 0.938916 NaN NaN NaN NaN 0.974316 NaN
25 NaN NaN NaN NaN NaN NaN 0.901233
26 NaN NaN NaN NaN NaN NaN NaN
27 NaN NaN NaN NaN NaN NaN NaN
28 NaN NaN 0.938866 NaN NaN NaN 0.948390
29 NaN NaN NaN NaN NaN NaN NaN
方法2 这将给出一个包含索引信息的系列列表。
In [7]: top10 = list()
In [8]: def process(col):
...: top10.append(col.sort_values(ascending=False).head(10))
...:
In [9]: df.apply(process,axis=0)
In [10]: top10
Out[10]:
[47 0.968147
65 0.959752
16 0.952427
24 0.938916
69 0.936472
60 0.922857
63 0.922337
18 0.908944
95 0.888692
3 0.884964
Name: 0, dtype: float64, 41 0.993644
39 0.976932
77 0.969164
47 0.966638
32 0.963084
72 0.941212
42 0.922804
49 0.919793
64 0.917230
12 0.907756
Name: 1, dtype: float64, 56 0.994861
33 0.985983
37 0.985021
79 0.981566
63 0.975600
53 0.953656
35 0.940664
28 0.938866
86 0.933991
10 0.932619
Name: 2, dtype: float64, 50 0.999863
答案 1 :(得分:0)
bL = []
for row, index in df.iterrows():
temp_row = row.copy()
temp_row.sort() # in-memory sorting and it returns nothing.
a = temp_row[-10:] # the 10 largest numbers
b = np.where( row >= a[0]) # get index of 10 largest numbers
bL.append(b) # save it
答案 2 :(得分:0)
尝试:
df=pd.DataFrame(rand(1000,1000)) # numbers in [0,1[
只需使用np.argsort,即返回索引而不是值,并保持十个持续时间:
In [5]: argsort(df,axis=1).iloc[:,-10:]
"""
990 991 992 993 994 995 996 997 998 999
0 541 720 274 740 174 408 522 385 566 530
1 587 224 75 983 634 89 160 343 239 556
2 878 154 377 199 769 825 271 731 925 53
3 240 581 945 692 737 57 714 144 186 506
4 895 881 244 984 647 983 105 312 562 755
...
"""
测试:
In [7]: df.loc[0,541]
Out[7]: 0.9926658777347247 # a big number
对于相应的值,例如只需sort(df,axis=1)[:,-10:]
。