python - 高效地将列中的函数应用到其他列

标签 python pandas

假设我有一个如下所示的 DataFrame:

import pandas as pd

df = pd.DataFrame({'x': [1,2,3], 'f': [lambda x: x + 1,
                                       lambda x: x ** 2, 
                                       lambda x: x / 5]})

我想将每个“x”的“f”应用到一个新列“y”中。我现在的做法是使用 apply,但这有点慢。有没有更好的办法?在 DataFrame 中存储 lambda 是个坏主意吗?

df['y'] = df.apply(lambda row: row['f'](row['x']), axis=1)

最佳答案

Is storing lambdas in DataFrames a bad idea?

我想是的,因为 pandas 只对标量有效。


如果在列表理解中使用循环,它会更快:

df = pd.DataFrame({'x': [1,2,3], 'f': [lambda x: x + 1,
                                       lambda x: x ** 2, 
                                       lambda x: x / 5]})

#3k rows
df = pd.concat([df] * 1000, ignore_index=True)

In [97]: %timeit df['y'] = df.apply(lambda row: row['f'](row['x']), axis=1)
104 ms ± 3.83 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [98]: %timeit df['y1'] = [f(x) for f, x in zip(df['f'], df['x'])]
3 ms ± 93 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

#300k
df = pd.concat([df] * 100000, ignore_index=True)
In [102]: %timeit df['y'] = df.apply(lambda row: row['f'](row['x']), axis=1)
10.3 s ± 315 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [103]: %timeit df['y1'] = [f(x) for f, x in zip(df['f'], df['x'])]
318 ms ± 4.64 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

关于python - 高效地将列中的函数应用到其他列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56489098/

相关文章:

python smoothxmpp & gchat 发送 "invisible"存在

python - csv.writer.writerows 需要迭代器?

python - Python 中的模糊图像识别

Python Selenium-webdriver : for loop returning first element of the list throughout the loop

python-3.x - Pandas 按两列分组,并获取按降序排序的其中一列的每个值的前 n 行

python - 如何将数据帧合并到第二个数据帧中的每一行?

python - 按列名切片的 Pandas 数据

python - 列表 append 在 Pandas 单元格中

python - 在 Pandas 拆分中使用 str

python - 使用matplotlib和mysql数据库创建散点图