python - 更改数据框中多个位置的最快方法

标签 python python-3.x pandas

我有一个包含 100 万行的 pandas 数据框。我想用另一组值替换一列中 900,000 行中的值。有没有没有 for 循环的快速方法(这需要我两天才能完成)?

例如,看看这个示例数据框,我将 100 万行压缩为 8 行

import numpy as np
import pandas as pd

df = pd.DataFrame()
df['a'] = [-1,-3,-4,-4,-3, 4,5,6]
df['b'] = [23,45,67,89,0,-1, 2, 3]

L2 = [-1,-3,-4]
L5 = [9,10,11]

如果可能的话,我想一次性替换 a 为 -1、-3、-4 的值,或者在没有 for 循环的情况下尽快替换值。

关键部分是 L5 中的值必须根据需要重复。

我试过了

df.loc[df.a < 0, 'a'] = L5

但这仅在 len(df.a.values) == len(L5)

时有效

最佳答案

使用map通过 zip 从两个 list 创建的字典,最后用 fillna 替换为原始的不匹配值:

d = dict(zip(L2, L5))
print (d)
{-1: 9, -3: 10, -4: 11}

df['a'] = df['a'].map(d).fillna(df['a'])
print (df)
      a   b
0   9.0  23
1  10.0  45
2  11.0  67
3  11.0  89
4  10.0   0
5   4.0  -1
6   5.0   2
7   6.0   3

性能:

这取决于替换 list 长度的值的数量:

list的长度是100:

np.random.seed(123)
N = 1000000

df = pd.DataFrame({'a':np.random.randint(1000, size=N)})

L2 = np.arange(100)
L5 = np.arange(100) + 10


In [336]: %timeit df['d'] = np.select([df['a'] == i for i in L2], L5, df['a'])
180 ms ± 1.07 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [337]: %timeit df['a'].map(dict(zip(L2, L5))).fillna(df['a'])
56.9 ms ± 2.55 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

如果列表的长度很小(例如 3):

np.random.seed(123)
N = 1000000

df = pd.DataFrame({'a':np.random.randint(100, size=N)})

L2 = np.arange(3)
L5 = np.arange(3) + 10

In [339]: %timeit df['d'] = np.select([df['a'] == i for i in L2], L5, df['a'])
11.9 ms ± 40.6 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [340]: %timeit df['a'].map(dict(zip(L2, L5))).fillna(df['a'])
54 ms ± 215 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

关于python - 更改数据框中多个位置的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51636434/

相关文章:

python - 如何比较具有相同索引的两行并根据特定条件删除一行?

python - 列表中整数元素的减法

python - 发出成功的 Python HTTP POST 请求

python - 我在 Pandas 系列中这样做时的值(value)在哪里

python - 如何获取 Pandas 数据框中所有非 NaN 项的行、列索引

python - 在单个特征数据框中查找质心和点之间的距离 - KMeans

python - docx 中的 add_paragraph() 添加换行符

python - 两个数组累积交集的快速算法

python - ValueError : Failed to find font DejaVu Sans:style=normal:variant=normal:weight=normal. ..并且回退到默认字体被禁用

python - 按 ID 对列求和,但跳过第一个实例?