相关疑难解决方法(0)

如何将字符串列表映射到整数列表

我有一个包含 n 个元素的列表:

['pea', 'rpai', 'rpai', 'schiai', 'pea', 'rpe', 'zoi', 'zoi', 'briai', 'rpe']
Run Code Online (Sandbox Code Playgroud)

我必须为每个字符串分配一个数字,开头为零,然后如果元素不同则加一,如果元素重复则给相同的数字。例子:

['pea', 'rpai', 'rpai', 'schiai', 'pea', 'rpe', 'zoi', 'zoi', 'briai', 'rpe']
[ 0,    1,      1,      2,        0,     3,     4,     4,     5,       3    ]
Run Code Online (Sandbox Code Playgroud)

我该怎么做?

python

19
推荐指数
4
解决办法
679
查看次数

为列表中的每个唯一值分配一个数字

我有一个字符串列表.我想为每个字符串分配一个唯一的编号(确切的数字并不重要),并按顺序使用这些编号创建一个相同长度的列表.以下是我最好的尝试,但我不满意有两个原因:

  1. 它假设相同的值彼此相邻

  2. 我必须用a开始列表0,否则输出将是不正确的

我的代码:

names = ['ll', 'll', 'll', 'hl', 'hl', 'hl', 'LL', 'LL', 'LL', 'HL', 'HL', 'HL']
numbers = [0]
num = 0
for item in range(len(names)):
    if item == len(names) - 1:
      break
    elif names[item] == names[item+1]:
        numbers.append(num)
    else:
        num = num + 1
        numbers.append(num)
print(numbers)
Run Code Online (Sandbox Code Playgroud)

我想使代码更通用,因此它将使用未知列表.有任何想法吗?

python list

13
推荐指数
3
解决办法
1万
查看次数

用向量化替换lambda x对排序函数的性能增强

我有一个排名函数,我应用于数百万行的大量列,需要几分钟才能运行.通过删除准备数据以应用该.rank(方法的所有逻辑,即通过这样做:

ranked = df[['period_id', 'sector_name'] + to_rank].groupby(['period_id', 'sector_name']).transform(lambda x: (x.rank(ascending = True) - 1)*100/len(x))        
Run Code Online (Sandbox Code Playgroud)

我设法把它降到了几秒钟.但是,我需要保留我的逻辑,并且正在努力重构我的代码:最终,最大的瓶颈是我对lambda x:的双重使用,但显然其他方面正在减慢速度(见下文).我提供了一个示例数据框,以及下面的排名函数,即MCVE.从广义上讲,我认为我的问题归结为:

(i)如何.apply(lambda x用快速的矢量化等价替换代码中的用法?(ii)如何循环多索引,分组,数据帧并应用函数?就我而言,对于date_id和category列的每个唯一组合.
(iii)我还能做些什么来加快我的排名逻辑?主要的开销似乎是在.value_counts().这与上面的(i)重叠; 也许在发送排名之前,可以通过构建临时列来在df上完成大部分逻辑操作.同样,可以在一次调用中对子数据帧进行排名吗?
(iv)为什么要使用pd.qcut()而不是df.rank()?后者是cython化的,似乎有更灵活的关系处理,但我看不出两者之间的比较,pd.qcut()似乎最广泛使用.

样本输入数据如下:

import pandas as pd
import numpy as np
import random

to_rank = ['var_1', 'var_2', 'var_3']
df = pd.DataFrame({'var_1' : np.random.randn(1000), 'var_2' : np.random.randn(1000), 'var_3' : np.random.randn(1000)})
df['date_id'] = np.random.choice(range(2001, 2012), df.shape[0])
df['category'] = ','.join(chr(random.randrange(97, 97 + 4 + 1)).upper() for x in range(1,df.shape[0]+1)).split(',')
Run Code Online (Sandbox Code Playgroud)

这两个排名功能是:

def rank_fun(df, …
Run Code Online (Sandbox Code Playgroud)

python lambda vectorization ranking pandas

13
推荐指数
1
解决办法
756
查看次数

在numpy中转换一组数字,以便将每个数字转换为一些小于它的其他数字

考虑一组数字:

In [8]: import numpy as np

In [9]: x = np.array([np.random.random() for i in range(10)])

In [10]: x
Out[10]: 
array([ 0.62594394,  0.03255799,  0.7768568 ,  0.03050498,  0.01951657,
        0.04767246,  0.68038553,  0.60036203,  0.3617409 ,  0.80294355])
Run Code Online (Sandbox Code Playgroud)

现在,我想这组变换成另一组y以下列方式:每个元素ix,相应的元素jy将其他元素的数量在x这不到i.例如,上面给出的内容x如下:

In [25]: y
Out[25]: array([ 6.,  2.,  8.,  1.,  0.,  3.,  7.,  5.,  4.,  9.])
Run Code Online (Sandbox Code Playgroud)

现在,我可以使用简单的python循环来做到这一点:

In [16]: for i in range(len(x)):
    ...:     tot = 0
    ...:     for j in …
Run Code Online (Sandbox Code Playgroud)

python numpy python-3.x

8
推荐指数
2
解决办法
210
查看次数

标签 统计

python ×4

lambda ×1

list ×1

numpy ×1

pandas ×1

python-3.x ×1

ranking ×1

vectorization ×1