【问题标题】:How to perform an operation with two columns in the same dataframe in Python Pandas?如何在 Python Pandas 中对同一数据框中的两列执行操作?
【发布时间】:2021-09-28 15:44:23
【问题描述】:

我正在尝试从名为'df' 的数据框中应用操作'x-y/y',即x'Faturamento'y'Custo',并将结果存储在名为@ 的新列中987654327@.

我尝试使用 apply 功能:

df['Roi'] = df.apply(lambda x, y: x['Faturamento']-y['Custo']/y['Custo'], axis=1)

正在返回:

TypeError: () 缺少 1 个必需的位置参数:'y'

我该怎么做?

【问题讨论】:

  • 尝试将该行更改为:df['Roi'] = df.apply(lambda x: (x['Faturamento']-x['Custo'])/x['Custo'], axis=1)
  • 尽可能使用内置的 Pandas 功能。这种情况下,你不需要依赖.apply() 和 lambda 函数,它主要用于没有内置函数的情况。仅使用 Pandas 的按列操作将是此用例的最佳选择。
  • 我会给你一些基准数据,你就会知道其中的区别。
  • 查看 Pandas 内置按列操作的 833 倍速度.apply + lambda 函数对于 40000 行数据集的巨大差异。即使对于 4 行的小数据集,内置的 Pandas 仍然更快。
  • 绝对应该使用 Pandas 内置的算术运算函数,而不是使用.apply() + lambda

标签: python pandas dataframe lambda apply


【解决方案1】:

您可以只使用带有简单算术等语法的列操作。 Pandas 会自动为你对齐索引,让你对每个操作逐行操作。

df['Roi'] = (df['Faturamento'] - df['Custo']) / df['Custo']

df['Roi'] = df['Faturamento'] / df['Custo'] - 1

这样,您可以享受经过优化以快速运行的 Pandas 的快速矢量化处理。如果在axis=1 上使用.apply() 和lambda 函数,这只是底层处理中的慢Python 循环,并且会很慢。

性能基准

测试 1. 小df 4 行

   Faturamento  Custo
0           50     20
1           10      5
2            5     15
3          100    400
%%timeit
df['Roi'] = df.apply(lambda x: (x['Faturamento']-x['Custo'])/x['Custo'], axis=1)

721 µs ± 3.54 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%%timeit
df['Roi'] = df['Faturamento'] / df['Custo'] - 1

490 µs ± 4.83 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

总结:.apply + lambda 采用 721 µs 而 Pandas 内置采用 490 µs对于 .

测试 2。大 df 有 40000 行

df2 = pd.concat([df] * 10000, ignore_index=True)
%%timeit
df2['Roi'] = df2.apply(lambda x: (x['Faturamento']-x['Custo'])/x['Custo'], axis=1)

639 ms ± 3.62 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%%timeit
df2['Roi'] = df2['Faturamento'] / df2['Custo'] - 1

767 µs ± 12.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

总结:.apply + lambda 采用 639 ms (= 639,000 µs) 而 Pandas 内置采用 767 µs对于 .

【讨论】:

  • 耶!谢谢,可以的
  • @CarolVieira 我认为您应该使用像这个解决方案这样的矢量化且更简单的版本,而不是仍然使用 .apply 和 lambda 函数。
【解决方案2】:

我想你的意思是:

df['Roi'] = df.apply(lambda x: (x['Faturamento']-x['Custo'])/x['Custo'], axis=1)

x 指的是数据框

【讨论】:

    猜你喜欢
    • 2018-04-11
    • 2017-03-16
    • 2023-04-06
    • 2021-06-07
    • 2022-01-12
    • 2018-06-14
    • 2017-09-02
    • 2020-05-01
    • 1970-01-01
    相关资源
    最近更新 更多