如何在Pandas中使用生成器

问题描述 投票:2回答:2

我正在学习使用发电机,但不太了解它们是如何工作的。

我想要做的是迭代行并将每个单元格中的另一个单元格乘以一个单元格,然后创建一个包含结果的新列。

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
python pandas generator
2个回答
3
投票

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

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

这也适用于DataFrames和利用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倍。这是一个非常小的样本量。


1
投票

你不需要发电机来做你想做的事情;这可以通过以下方式轻松实现:

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)

© www.soinside.com 2019 - 2024. All rights reserved.