python - 高效地将值从一列替换为另一列 Pandas DataFrame

标签 python pandas replace dataframe

我有一个像这样的 Pandas DataFrame:

   col1 col2 col3
1   0.2  0.3  0.3
2   0.2  0.3  0.3
3     0  0.4  0.4
4     0    0  0.3
5     0    0    0
6   0.1  0.4  0.4

仅当 col1 值等于 0 时,我想用第二列 (col2) 中的值替换 col1 值,之后(对于剩余的零值),再次执行此操作,但使用第三列 (col3)。期望的结果是下一个:

   col1 col2 col3
1   0.2  0.3  0.3
2   0.2  0.3  0.3
3   0.4  0.4  0.4
4   0.3    0  0.3
5     0    0    0
6   0.1  0.4  0.4

我使用 pd.replace 函数完成了它,但它似乎太慢了。我认为必须有一种更快的方法来完成它。

df.col1.replace(0,df.col2,inplace=True)
df.col1.replace(0,df.col3,inplace=True)

有没有更快的方法来做到这一点?使用其他函数代替 pd.replace 函数?

最佳答案

使用 np.where是比较快的。使用与 replace 类似的模式:

df['col1'] = np.where(df['col1'] == 0, df['col2'], df['col1'])
df['col1'] = np.where(df['col1'] == 0, df['col3'], df['col1'])

但是,使用嵌套的 np.where 稍微快一些:

df['col1'] = np.where(df['col1'] == 0, 
                      np.where(df['col2'] == 0, df['col3'], df['col2']),
                      df['col1'])

时间

使用以下设置生成更大的样本 DataFrame 和计时函数:

df = pd.concat([df]*10**4, ignore_index=True)

def root_nested(df):
    df['col1'] = np.where(df['col1'] == 0, np.where(df['col2'] == 0, df['col3'], df['col2']), df['col1'])
    return df

def root_split(df):
    df['col1'] = np.where(df['col1'] == 0, df['col2'], df['col1'])
    df['col1'] = np.where(df['col1'] == 0, df['col3'], df['col1'])
    return df

def pir2(df):
    df['col1'] = df.where(df.ne(0), np.nan).bfill(axis=1).col1.fillna(0)
    return df

def pir2_2(df):
    slc = (df.values != 0).argmax(axis=1)
    return df.values[np.arange(slc.shape[0]), slc]

def andrew(df):
    df.col1[df.col1 == 0] = df.col2
    df.col1[df.col1 == 0] = df.col3
    return df

def pablo(df):
    df['col1'] = df['col1'].replace(0,df['col2'])
    df['col1'] = df['col1'].replace(0,df['col3'])
    return df

我得到以下时间:

%timeit root_nested(df.copy())
100 loops, best of 3: 2.25 ms per loop

%timeit root_split(df.copy())
100 loops, best of 3: 2.62 ms per loop

%timeit pir2(df.copy())
100 loops, best of 3: 6.25 ms per loop

%timeit pir2_2(df.copy())
1 loop, best of 3: 2.4 ms per loop

%timeit andrew(df.copy())
100 loops, best of 3: 8.55 ms per loop

我尝试为您的方法计时,但它已经运行了好几分钟而没有完成。作为比较,仅在 6 行示例数据帧(不是上面测试的更大的数据帧)上对您的方法进行计时需要 12.8 毫秒。

关于python - 高效地将值从一列替换为另一列 Pandas DataFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39903090/

相关文章:

php - Swift,stringByReplacingOccurencesOfString 和替换数组

python - 使用 Excel 电子表格表示树层次结构以便 Python CSV 阅读器轻松解析?

python - 如果条件为真则合并子列表

python - 为什么类型错误为: __init__() takes 1 positional argument but 2 were given when running sql commands

python - 使用 to_hdf 将 pandas 数据帧保存到磁盘时出现段错误

python - 如何使用 pandas 在一个命令行中连续写入多个值

javascript - 用 javascript 进行多次替换

python - 计算 S3 存储桶中的键

python - Pandas - 将数据帧多索引转换为日期时间对象

Linux 查找并替换文件名中的日语字符串