如何在熊猫中使用发电机

我要

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

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

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
r

简洁的回答是“你不要”。或如熊猫文件所述:

在进行数据分析时,与原始的NumPy数组一样,通常不需要逐个序列循环。系列也可以传递给大多数需要ndarray的NumPy方法。

这也适用于DataFrames和许多其他利用杠杆的结构ndarray要获得更多见解,我真的建议您详细了解熊猫/ NumPy / SciPy在内部如何工作。

关于这个特定主题,我将向您介绍Pandas-数据结构简介-数据对齐和算术以及NumPy-广播

这些程序包在后台使用了大量的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倍。这是一个非常小的样本量。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章