繁体   English   中英

dataframe 的列中存在的子集字符串,具体取决于另一列的值 - Pandas

[英]Subsetting strings present in a column of a dataframe, depending on value of another column - Pandas

我有一个 dataframe 有 2 列 A 和 B 说,分别包含字符串和整数。 例如,考虑以下数据。

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

现在,我必须创建另一列 C,其中对于每个索引 i, df['C'][i]将包含字符串 s,其中 s 是从df['B'][i] -th 开始的字符串字符串df['A'][i]的字符。 对于上述示例,output 将是:

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

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

我的尝试:

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

但是我的数据集很大(包含大约 500 万行) - 所以使用循环或 lambdas 根本没有效率。 如何在不使用 lambda 或循环的情况下有效地做到这一点? 任何建议都受到高度赞赏。 谢谢你。

您可以避免使用 pandas 应用,并使用本机 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM