![](/img/trans.png)
[英]get column value based on another column with list of strings in pandas dataframe
[英]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.