我有一个包含 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)
我该怎么做?
我有一个字符串列表.我想为每个字符串分配一个唯一的编号(确切的数字并不重要),并按顺序使用这些编号创建一个相同长度的列表.以下是我最好的尝试,但我不满意有两个原因:
它假设相同的值彼此相邻
我必须用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)
我想使代码更通用,因此它将使用未知列表.有任何想法吗?
我有一个排名函数,我应用于数百万行的大量列,需要几分钟才能运行.通过删除准备数据以应用该.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) 考虑一组数字:
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以下列方式:每个元素i中x,相应的元素j在y将其他元素的数量在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)