有效地将值从一列替换到另一列 Pandas DataFrame

2023-11-27

我有一个像这样的 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值与第二列中的值 (col2) 除非col1值等于 0,然后(对于剩余的零值)再次执行此操作,但使用第三列 (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功能?


Using 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'])

Timings

使用以下设置生成更大的示例 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 行示例 DataFrame(不是上面测试的更大的 DataFrame)上对方法进行计时需要 12.8 毫秒。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有效地将值从一列替换到另一列 Pandas DataFrame 的相关文章

随机推荐

  • 将 RxJS Observable 收集到数组

    我想使用 RxJS 将异步事件世界与同步世界 桥接 具体来说 我想创建一个函数 它返回在某个时间间隔内收集的事件数组 我可以创建 Observable 来执行我想要的操作 var source Rx Observable interval
  • 无法识别“pip”[重复]

    这个问题在这里已经有答案了 我尝试安装PySide但我从 powershell 收到错误如下 pip The term pip is not recognized as the name of a cmdlet function scrip
  • 检测可移动介质的弹出/插入

    我正在开发一个项目 需要能够检测何时插入或移除 CD 或 USB 驱动器 我发现一些源代码本应执行此操作 但是 当我插入或弹出 CD 时 似乎没有任何反应 有人可以验证来源是否正确 并指出我在这里可能做错了什么吗 public class
  • 有人可以解释一下这个 C++ typedef 吗?

    我已经有一段时间没有使用 C 了 刚刚开始使用它 虽然大部分内容都有道理 但有些地方我发现有点混淆 例如 有人可以解释一下这一行的作用吗 typedef bool OptionManager OptionHandler const ABSt
  • Android 加速度计精度(惯性导航)

    我正在考虑为 Android 手机实现惯性导航系统 但我意识到考虑到加速度计的精度和读数的持续波动 这很难 首先 我将手机放在平坦的表面上 并在 X 和 Y 方向上采样了 1000 个加速度计读数 与桌子平行 因此这些方向上没有重力作用 然
  • pandas json_normalize 具有非常嵌套的 json

    我一直在努力normalize一个非常嵌套的 json 文件 我稍后将进行分析 我正在努力解决的是如何进一步深入正常化 我经历了pandas io json json normalize文档 因为它完全按照我想要的方式执行 我已经能够将其中
  • 按时间间隔聚合一个数据帧来自另一个数据帧

    我正在尝试聚合两个数据帧 df1 and df2 第一个包含 3 个变量 ID Date1 and Date2 df1 ID Date1 Date2 1 2016 03 01 2016 04 01 1 2016 04 01 2016 05
  • QList什么时候会发生深拷贝?

    在我正在上的一堂课上 我正在同时处理几个问题QLists 我听说 Qt 尽可能不进行列表的深层复制 据我了解 这意味着执行此操作时不会发生深层复制 QList
  • 使用 angularjs 导出到 xls

    我正在开发 Angular JS 应用程序 但我陷入了必须使用 Angular JS 将数据导出到 Xls 的情况 我在互联网上搜索了很多导出功能或任何 Angular js 库 所以我可以做到这一点 或者至少我可以了解如何导出 我没有任何
  • 使用 .gif 的动画启动画面

    我想使用动画gif对于启动画面 所以我改变了src在 config xml 中放入我的 gif 中 如下所示
  • 如何在Cocoa中绘制锥形线+椭圆形阴影

    背景 下图是 OS X Lion 中的 Mail app 当源列表变得太长时 源列表底部的按钮上方会出现一条漂亮的阴影线 当您滚动时 源列表将移动到该阴影线下方 当您展开窗口以使源列表中的所有内容都适合而无需滚动时 阴影线就会消失 问题 我
  • Android Studio 导出带有依赖项的 jar

    我在 Eclipse 中有一个带有 Maven 的项目库 生成的 jar 包含一些库依赖项 现在我正在迁移到 Android Studio 我想构建相同的 jar 我可以在 gradle 中生成一个包含以下几行的 jar task clea
  • 为什么 console.log(document.getElementById( 'blah' ))) 在 Chrome 中给出不同的日志消息?

    我只是在乱搞 正在注销我用标准 javascript 选择的 div 但我已在 jQuery document ready fn 块内执行了该 div document ready function console log document
  • 如何使用 Java 类的参数调用 Python 脚本

    我在用Python 3 4 我有一个Python脚本myscript py import sys def returnvalue str if str hi return yes else return no print calling p
  • ScrollView 与 TimePicker 的滚动发生冲突,结果 Timepicker 不滚动

    希望这里有一个解决方案 我的 main xml 中有一个 XML TimePicker 和 ScrollView 并且设置后 TimePicker 不会滚动 如果我删除 ScrollView Timepicker 会滚动得很好 但显然我两者
  • 恢复推送的 git 提交

    我有一个有两个分支的存储库 master 和 dev 我正在主分支上工作并拉取 并收到一条消息说存储库是最新的 我提交了更改 并推送到远程存储库 在 github 上 我收到一条消息 说某些更改被拒绝 然后我做了一个git pull ori
  • 在函数内部调用对象

    所以我不会在 PHP 中进行 OOP 这是我的问题 我有一个对象 我可以从中调用函数 并且它返回一个数组 这是代码 obj new OBJ function go url array obj gt grabArray url echo ar
  • 在 fugitive.vim 冲突 diff 中显示基数

    默认情况下 如果您使用逃亡者 vim s Gdiff在与 git 冲突的文件缓冲区上 您将得到一个三路差速器显示HEAD 工作副本 带有冲突标记 和merge 我喜欢有git config merge conflictstyle diff3
  • Azure 通知中心 - 如何在同一中心设置多个应用程序

    我遇到过这样的情况 我需要对多个 iOS 应用程序使用相同的通知中心 对于给定的标签 所有应用程序都应该接收此推送 每个 iOS 应用程序都有不同的推送通知证书 因此只有其中一个应用程序实际收到了推送通知 我不想决定打开多个中心 因为那样我
  • 有效地将值从一列替换到另一列 Pandas 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 我想更换col