[英]How to perform an operation with two columns in the same dataframe in Python Pandas?
我正在尝试应用操作'xy/y'
, x
列'Faturamento'
和y
列'Custo'
来自 dataframe 称为'df'
,并将结果存储在名为'Roi'
的新列中。
我尝试使用申请 function:
df['Roi'] = df.apply(lambda x, y: x['Faturamento']-y['Custo']/y['Custo'], axis=1)
正在返回:
TypeError: () missing 1 required positional argument: 'y'
我怎样才能做到这一点?
您可以只使用简单算术等语法的列操作。 Pandas会自动为你对齐索引,让你每次操作都在逐行操作。
df['Roi'] = (df['Faturamento'] - df['Custo']) / df['Custo']
或者
df['Roi'] = df['Faturamento'] / df['Custo'] - 1
这样,您就可以享受Pandas的快速矢量化处理,它已经过优化以快速运行。 如果您在axis=1
上将.apply()
与 lambda function 一起使用,它只是底层处理中的一个缓慢的 Python 循环,而且会很慢。
测试 1. 4 行的小型df
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 built-in 需要490 µs
:小数据集快 1.47 倍。
测试 2. 具有 40000 行的大型df
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
:对于大型数据集,速度快 833 倍。
我想你的意思是:
df['Roi'] = df.apply(lambda x: (x['Faturamento']-x['Custo'])/x['Custo'], axis=1)
x
指的是dataframe
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.