【问题标题】:Subsetting strings present in a column of a dataframe, depending on value of another column - Pandas根据另一列的值,对数据框列中存在的字符串进行子集化 - Pandas
【发布时间】:2022-08-03 00:25:33
【问题描述】:
我有一个具有 2 列 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
这可以很容易地使用 lambdas 或 for 循环来完成。
我的尝试:
df[\'C\']=df.apply(lambda x: x.A[x[\'B\']:], axis=1)
但是我的数据集很大(包含大约 500 万行) - 所以使用循环或 lambdas 根本没有效率。在不使用 lambdas 或循环的情况下如何有效地做到这一点?任何建议都受到高度赞赏。谢谢你。
标签:
python
pandas
dataframe
【解决方案1】:
您可以避免使用 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