【问题标题】:Pandas Apply Function Ver Slow - Using Value Counts with a List LookupPandas 应用函数非常慢 - 将 Value_counts 与列表查找一起使用
【发布时间】:2019-06-17 22:06:31
【问题描述】:

我有一个如下所示的 pandas DF,我正在尝试将不同行中的值计数转换为以下格式:

   COL1    COL2    COL3
    C1      None    None
    C1      C2      None
    C1      C1      None
    C1      C2      C3

    C1  C2  C3
     1   0   0
     1   1   0
     2   0   0
     1   1   1

我在这里找到了这个答案 (Count occurrences of items in Series in each row of a DataFrame)

这可以满足我的需要,但在我的数据集(400 万行)上非常慢。我试着用 400,000 行来做,但它仍然没有以可接受的速度运行。

我相信它是通过大量数据集进行查找的列表,并且 apply 本质上是一个 for 循环。是巨大的循环减慢了这个过程。这里的潜在解决方案基本上提到不要使用 Apply,这会使这里的执行变得乏味,因为我的列表中有 C1、C2...C100 和 10 个垂直列来验证计数。关于我可以在这里尝试什么来提高性能的任何提示?

下面是代码:

df_store = df.apply(pd.Series.value_counts, axis=1)[list_lookup].fillna(0)

【问题讨论】:

    标签: python-3.x pandas numpy pandas-apply


    【解决方案1】:

    这就是为什么我们通常不使用apply

    df.stack().str.get_dummies().sum(level=0).drop('None',1)
    Out[157]: 
       C1  C2  C3
    0   1   0   0
    1   1   1   0
    2   2   0   0
    3   1   1   1
    

    或者使用Counter

    from  collections import Counter
    
    
    pd.DataFrame([ Counter(x) for x in df.values]).drop('None',1)
    Out[170]: 
       C1   C2   C3
    0   1  NaN  NaN
    1   1  1.0  NaN
    2   2  NaN  NaN
    3   1  1.0  1.0
    

    【讨论】:

    • 感谢您的回复! stack 方法已经在 400k 行上运行了大约 20 分钟。柜台还是很低吧?因为它循环遍历每一行。想知道我是否应该转换为单独的行并在重新组合之前单独运行它。
    【解决方案2】:

    如果你想要更快的解决方案,你需要使用 numpy.使用来自 numpy 的 one-hot 编码并将 ndarray 结果分配给数据帧。基于我的%timeit,它比Counter 解决方案快大约6 倍。缺点是您需要提前知道要编码的值,在您的情况下是C1C2C3....C100

    encode_val = np.array(['C1', 'C2', 'C3'])
    encode_arr = (df.values[...,None] == encode_val).astype(int).sum(1)
    
    Out[237]:
    array([[1, 0, 0],
           [1, 1, 0],
           [2, 0, 0],
           [1, 1, 1]])
    
    pd.DataFrame(encode_arr, columns=encode_val)
    
    Out[238]:
       C1  C2  C3
    0   1   0   0
    1   1   1   0
    2   2   0   0
    3   1   1   1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-08
      • 2020-08-15
      • 2014-06-05
      • 2014-03-25
      • 1970-01-01
      • 1970-01-01
      • 2011-01-24
      • 1970-01-01
      相关资源
      最近更新 更多