【问题标题】: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
    

    【讨论】:

      猜你喜欢
      • 2022-08-21
      • 1970-01-01
      • 2016-12-15
      • 2013-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-14
      相关资源
      最近更新 更多