数据帧的一列中存在的子集字符串,取决于另一列Pandas的值



我有一个数据帧,它有两列a和B,分别包含字符串和整数。例如,考虑以下数据。

df = pd.DataFrame({'A': ["xxxdddrrrfvhdddfff", "trdyuuweewy", "oooeereghtyuj"], 'B':[3, 2, 6]})

现在,我必须创建另一列C,其中对于每个索引I,df['C'][i]将包含字符串s,其中s是从字符串df['A'][i]的第df['B'][i]个字符开始的字符串。对于上面的例子,输出将是:

A         B                C
xxxdddrrrfvhdddfff    3    xdddrrrfvhdddfff
trdyuuweewy           2    rdyuuweewy 
oooeereghtyuj         6    reghtyuj

这可以很容易地使用lambda或for循环来完成。

我的尝试:

df['C']=df.apply(lambda x: x.A[x['B']:], axis=1)

但我的数据集很大(包含大约500万行(,所以使用循环或lambda根本没有效率。在不使用lambda或循环的情况下,我如何有效地做到这一点?任何建议都将不胜感激。非常感谢。

您可以避免使用pandas-apply,并使用原生python使其更加高效。请尝试以下操作:

df['C'] = [x[y-1:] for x,y in zip(df['A'],df['B'])]

我使用30000行和1000次迭代进行了测试:

df = pd.DataFrame({'A': ["xxxdddrrrfvhdddfff", "trdyuuweewy", "oooeereghtyuj"]*1000, 'B':[3, 2, 6]*1000})
times_zip = []
times_apply = []
for i in range(1000):
start = time.time()
df['C'] = [x[y-1:] for x,y in zip(df['A'],df['B'])]
end = time.time()
times_zip.append(end-start)

for i in range(1000):
start = time.time()
df['C']=df.apply(lambda x: x.A[x['B']:], axis=1)
end = time.time()
times_apply.append(end-start)

使用apply每次执行的平均时间为:

0.035329506397247315

而使用zip的平均时间为:

0.0006626224517822265

相关内容

最新更新