python - 在 panda.Dataframe 中有效地有条件地重新定位元素
问题描述
我正在尝试按以下方式对我的 data.frame 的值进行排序:
for i in range(len(df.index)):
if df.at[i, "x1"] <= df.at[i, "x2"]:
df2.at[i, "p1"] = df.at[i, "p1"]
df2.at[i, "x1"] = df.at[i, "x1"]
df2.at[i, "x2"] = df.at[i, "x2"]
else:
df2.at[i, "p1"] = df.at[i, "p2"]
df2.at[i, "x1"] = df.at[i, "x2"]
df2.at[i, "x2"] = df.at[i, "x1"]
它正在工作,但是对于我的 +40k 行来说它非常慢。我怎样才能更有效、更优雅地做到这一点?如果可能的话,我更喜欢直接操纵原始 df 的解决方案。
示例数据:
x1 p1 x2 p2
1 0.4 2 0.6
2 0.2 1 0.8
期望的输出:
x1 p1 x2 p2
1 0.4 2 0.6
1 0.8 2 0.2
解决方案
这是一种使用行选择然后使用该选择交换值的方法
check = df["x1"] > df["x2"]
df.loc[check, ["x2", "x1", "p2", "p1"]] = df.loc[check, ["x1", "x2", "p1", "p2"]].values
推荐阅读
- neo4j - 即使在安装插件后,Nepo4j 也无法使用 apoc 功能
- java - Java Iterator 正在跳过一半元素
- javascript - Angular 中的 Counter Up v2 插件(动画计数器)
- oracle - Oracle 访问 SQL 中的可变数组元素
- android - 使用 OR 运算符进行条件渲染
- azure - 可以使用 Powershell 导出 Azure 中的资源配置吗?
- prestashop - 将 prestashop 从 1.7.5 更新到 1.7.7.2 后出错
- next.js - 使用 res.writeHead() 将标头发送到客户端后无法设置标头
- tensorflow - 在多台设备机器上训练时是否有多个或单个模型?
- reactjs - 在选择标签reactjs中时在其他组件中呈现数据