python-3.x - Pandas 系列字符串比较
问题描述
我有一个巨大的数据框,我在两个条件下对其进行过滤。
一个可重现的玩具示例如下:
import pandas as pd
df_ = pd.DataFrame([["A",91,1], ["B",91,2], ["C",92,1]],
columns=['Name','Iteration','IP Weight'])
df2 = pd.DataFrame([["D",91,1], ["E",91,1], ["F",91,1]],
columns=['Name','Iteration','IP Weight'])
目标
如果df_
行与 df 的第一行具有相同的“迭代”和“ip_weight”组合,过滤并附加 df,这里第一行将被删除df_
并附df2
加到它。
我过滤如下,
df_[~((df_['Iteration']==df2['Iteration'][0]) & (df_['IP Weight']==df2['IP Weight'][0]))]
它在笔记本中运行良好,但是当我将其放入脚本中时,它会失败并显示消息
“ FutureWarning:元素比较失败;返回标量,但将来会执行元素比较”
非常感谢任何帮助。
解决方案
创建以下蒙版:
msk = df_['Iteration'].eq(df2.loc[0, 'Iteration'])\
& df_['IP Weight'].eq(df2.loc[0, 'IP Weight'])
我假设df2中的初始行具有索引 == 0。 此掩码的真值表示要从df_移动到df2的行。
然后附加要移动到df2的行:
df2 = df2.append(df_[msk], ignore_index=True)
最后从df_ 中删除它们:
df_ = df_[~msk]
编辑
创建蒙版的其他更简洁的方法是:
msk = df_.iloc[:, 1:].eq(df2.iloc[0, 1:]).all(axis=1)
这次无论df2第一行中的索引如何,它都会起作用。
推荐阅读
- python - 在 Jupyter Notebook 中,使用 geopandas,x-y 轴没有显示
- javascript - 如何从角度的弹簧启动中获得错误响应
- sql - 如何使用聚合函数加入视图?
- swiftui - SwiftUI LazyVStack 孩子在滚动时消失
- python - Python Selenium 我只从循环中获取第一个元素
- c++ - 错误:std::string 未在此范围内声明,在 for 循环 C++ 中
- kubernetes - 如何在 Kubernetes Operator 中执行无缝升级
- android - 如何将 bytearray 转换为 pdf 并以 ACTION_VIEW 意图显示
- c# - 在 ASP.NET Core MVC 中显示每个人的总价值
- android - 以最少的点击激活 GPS 传感器和权限