首页 > 解决方案 > 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:元素比较失败;返回标量,但将来会执行元素比较”

非常感谢任何帮助。

标签: python-3.xpandasdataframe

解决方案


创建以下蒙版:

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第一行中的索引如何,它都会起作用。


推荐阅读