python-2.7 - 对于 python 中给定的值条件,将列名称作为数据框中的列表返回

标签 python-2.7 list pandas dataframe

给定 1xN 数据框表,需要从行中选择 5 个最大值并将相应的列名返回到列表中。 这是数据框示例:

            5        2         13         15         37        8         89    
PageRank  0.444384  0.44453  0.444695  0.444882  0.444759  0.44488  0.444648

试过了,

r = list(pr.loc['PageRank'].nlargest(5))

但是创建的列表只有行中的值,没有列名。 如何获取 5 个最大单元格值的列名? 例如,在给定的数据框中,它应该返回

[15,37,13,89,5]

最佳答案

您可以使用 Numpy 的 np.argpartition 获得一些额外的性能。我将在负值上使用它以获得正确的方向。

我想使用 np.argpartition 而不是排序,因为它是 O(n) 而不是 O(nlogn) 的排序.

cols = pr.columns.values
rnks = -pr.values[0]
cols[np.argpartition(rnks, 5)[:5]].tolist()

['37', '15', '13', '8', '89']

时机
您会注意到 pir1 表现出色。但还要注意 nlargest 渐近地接近 pir1 的性能,因为它们都是 O(n)

jez1 = lambda d: list(d.loc['PageRank'].nlargest(5).index)
jez2 = lambda d: d.columns[d.loc['PageRank'].values.argsort()[::-1]][:5].tolist()
jez3 = lambda d: d.columns[d.loc['PageRank'].values.argsort()[-1:-6:-1]].tolist()
pir1 = lambda d: d.columns.values[np.argpartition(-d.values[0], 5)[:5]].tolist()

res = pd.DataFrame(
    index=[10, 30, 100, 300, 1000, 3000, 10000, 30000, 100000, 300000, 1000000],
    columns='jez1 jez2 jez3 pir1'.split(),
    dtype=float
)

for i in res.index:
    d = pd.DataFrame(dict(PageRank=np.random.rand(i))).T
    for j in res.columns:
        stmt = '{}(d)'.format(j)
        setp = 'from __main__ import d, {}'.format(j)
        res.at[i, j] = timeit(stmt, setp, number=200)

res.plot(loglog=True)

enter image description here

时序比
此表显示了每种方法的时间相对于该特定长度数组所用的最短时间的比率。

res.div(res.min(1), 0)

              jez1       jez2       jez3  pir1
10       20.740497   8.666576   6.738210   1.0
30       39.325125  11.962184  10.987012   1.0
100      30.121521  10.184435  10.173252   1.0
300      58.544734  11.963354  12.563072   1.0
1000     63.643729   9.361290   8.547374   1.0
3000     22.041026  15.977949  18.803516   1.0
10000     9.254778  11.620570  11.681464   1.0
30000     2.838243   7.522210   7.120721   1.0
100000    1.814005   7.486602   6.995017   1.0
300000    1.920776  13.213261  12.423890   1.0
1000000   1.332265   7.872120   7.225150   1.0

关于python-2.7 - 对于 python 中给定的值条件,将列名称作为数据框中的列表返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47493567/

相关文章:

python - 如何为 PyCharm 分配目录

python - 链式重载比较运算符

python - 比较具有相同元素且顺序相同的列表?

python - 如何将列转换为数字,同时在 pandas 中保持失败的列完好无损

python - 我可以在项目目录之外执行 scrapy(python) 抓取吗?

c++ - 我无法制作 list<int> 数组的 unique_ptr

c# - 在隔离存储中存储对象列表的问题

python - 将一个元素添加到Python字典中就是多次添加该元素

python - 动态 - 自动乘法 - Pandas 数据帧

python - 将人类可读的时间差(不是时间戳)转换为可用于排序的时间差