【问题标题】:Dask - Merge multiple columns into a single columnDask - 将多列合并为一列
【发布时间】:2020-04-14 14:34:57
【问题描述】:

我有一个如下的 dask 数据框:

   Column1  Column2  Column3  Column4  Column5
 0    a        1        2        3        4
 1    a        3        4        5
 2    b        6        7        8
 3    c        7        7        

我想有效地将​​所有列合并为一个列。我希望每一行都是一个单个字符串。如下:

   Merged_Column
 0    a,1,2,3,4   
 1    a,3,4,5  
 2    b,6,7,8  
 3    c,7,7,7        

我见过this question,但它似乎效率不高,因为它使用了apply 函数。我怎样才能尽可能高效地做到这一点? (速度+内存使用)或者是 apply 并不像我认为的那样有问题,因为这是 dask,而不是 pandas。

这是我尝试过的。看起来它正在工作,但我担心它在大数据帧中的速度。

cols= df.columns
df['combined'] = df[cols].apply(func=(lambda row: ' '.join(row.values.astype(str))), axis=1, meta=('str'))
df = df.drop(cols, axis=1)

我还需要去掉列标题。

【问题讨论】:

    标签: python pandas dask


    【解决方案1】:

    Lambda 函数会占用每一行,因此可能会影响进程的速度

    所以如果我们按列应用操作会很快

    df = df.astype(str)
    df["Column1"]+","+df["Column2"]+","+df["Column3"]+","+df["Column4"]+","+df["Column5"]
    

    【讨论】:

      【解决方案2】:

      当您必须加入字符串时,@saravanan saminathan 方法胜出。这里有一些时间与dask

      import dask.dataframe as dd
      import numpy as np
      import pandas as pd
      
      N = int(1e6)
      
      df = pd.DataFrame(np.random.randint(0,100,[N,10]))
      df = dd.from_pandas(df, npartitions=4)
      df = df.astype("str")
      df_bk = df.copy()
      

      申请

      %%time
      df["comb"] = df.apply(lambda x:",".join(x), axis=1,meta=("str"))
      df = df.compute()
      
      CPU times: user 44.4 s, sys: 925 ms, total: 45.3 s
      Wall time: 44.6 s
      

      添加(显式)

      df = df_bk.copy()
      
      %%time
      df["comb"] = df[0]+","+df[1]+","+df[2]+","+df[3]+","+df[4]+","+\
                   df[5]+","+df[6]+","+df[7]+","+df[8]+","+df[9]
      
      df = df.compute()
      
      CPU times: user 8.95 s, sys: 860 ms, total: 9.81 s
      Wall time: 9.56 s
      

      添加(循环)

      如果您有很多列并且不想写下所有列

      df = df_bk.copy()
      
      %%time
      df["comb"] = ''
      for col in df.columns:
          df["comb"]+=df[col]+","
      
      df = df.compute()
      
      CPU times: user 11.6 s, sys: 1.32 s, total: 12.9 s
      Wall time: 12.3 s
      

      【讨论】:

      • 标题 'Add(loop)' 下的代码 sn-p 在 df["comb"] 列中返回 'nan's。你确定这有效吗?
      • 我刚刚在循环之前检查了 df 内部的内容,它包含 nans 以外的值。
      猜你喜欢
      • 2020-05-01
      • 2011-02-27
      • 1970-01-01
      • 2019-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多