【问题标题】:How to use generators in Pandas如何在 Pandas 中使用生成器
【发布时间】:2018-01-04 04:50:05
【问题描述】:

我正在学习使用生成器,但不太了解它们的工作原理。

我想要做的是遍历行并将每行中的一个单元格乘以另一个单元格,然后使用结果创建一个新列。

rate = (df['Fee'][i] for df['Fee'] in df / df['Costs'][i] for df['Costs'] in df * 100)

df['rate']=df.iterrows(rate)

因此,在上面,我尝试制作一个生成器,它可以计算费用占成本的百分比。

我意识到使用 for 循环会更容易,但我想了解在这种情况下如何使用生成器。

下面的示例数据框。

          Industry  Expr1        Fee        Costs
      Food & Drink   June   9970.320    116171.15
    Music Industry   June   7255.534    131492.59
     Manufacturing   June   5278.960    171315.01
    Music Industry   June   6120.596    143688.78
Telecommunications  April   4123.986     78733.09

【问题讨论】:

  • df['Rate']=df.Fee/df.Costs
  • 你不会在这里使用生成器,也不会在 pandas/numpy 中使用生成器
  • 正如其他 cmets 指出的那样,利用 pandas 中的矢量化操作而不是使用循环。
  • 如果我错了,请纠正我,但那些是......迭代器,不是吗?
  • 另外,对象的typedf

标签: python pandas generator


【解决方案1】:

简洁的答案是“你不知道”。或者正如 Pandas 文档所说:

在进行数据分析时,通常不需要按值循环遍历 Series 的原始 NumPy 数组。 Series 也可以传递给大多数需要 ndarray 的 NumPy 方法。

这也适用于 DataFrame 和许多其他利用 ndarray 的结构。为了获得更多洞察力,我真的建议您了解更多关于 pandas/NumPy/SciPy 如何在内部工作的信息。

关于这个特定的主题,我会指出你 Pandas - Intro to Data Structures - Data Alignment and ArithmeticNumPy - Broadcasting

这些包在幕后使用大量 C 代码来优化操作。虽然生成器/迭代器很棒,但它们永远无法匹配这种优化的代码。例如,给定您的问题示例,这里是一个简单的测试。

np.all((df.Fee / df.Costs).values == np.array([x / y for x, y in df[['Fee', 'Costs']].values]))
True

%timeit (df.Fee / df.Costs).values
78.5 µs ± 1.88 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%timeit np.array([x / y for x, y in df[['Fee', 'Costs']].values])
331 µs ± 12.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

如您所见,Pandas 内部使用的内置除法方法快了约 5 倍。而且样本量非常小。

【讨论】:

    【解决方案2】:

    你不需要生成器来做你想做的事;这可以通过以下方式轻松实现:

    df['Rate'] = df.Fee / df.Costs
    

    但是,为了完整起见,这里是生成器方式:

    rate = [x / y for x, y in df[['Fee', 'Costs']].values]
    

    df[['Fee', 'Costs']] 提取相关列,.values 将该数据帧转换为您要为其编写迭代器的 num_rows x 2 numpy 数组。

    当你想对数据做一些更复杂的事情时,你可能不得不使用生成器语法,例如。将其传递给任意函数f(fee, cost)

    【讨论】:

      猜你喜欢
      • 2020-11-11
      • 1970-01-01
      • 2016-07-06
      • 2022-08-23
      • 2022-10-19
      • 2019-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多