Pandas 系列字符串比较

Posted

技术标签:

【中文标题】Pandas 系列字符串比较【英文标题】:Pandas Series String Comparison 【发布时间】:2020-11-09 10:25:18 【问题描述】:

我有一个巨大的数据框,我在其中根据两个条件对其进行过滤。

一个可重现的玩具示例如下:

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

非常感谢任何帮助。

【问题讨论】:

你用的是哪个版本的熊猫? 在 docker 容器中,它是 1.0.3,而在本地(按预期工作的笔记本)是 '0.24.2' 这对FutureWarning elementwise comparison failed有帮助吗? 【参考方案1】:

创建以下掩码:

msk = df_['Iteration'].eq(df2.loc[0, 'Iteration'])\
    & df_['IP Weight'].eq(df2.loc[0, 'IP Weight'])

我假设 df2 中的初始行具有索引 == 0。 此掩码的 True 值表示要从 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第一行的索引如何,它都会起作用。

【讨论】:

如何在不使用“~”的情况下达到相同的结果 看看我的回答中的 df_ = df_[~msk]。这正是您所要求的 - boolean indexingnegated 掩码的示例。【参考方案2】:

因此,当我按照您所说的在笔记本中运行类似您的示例时,它运行良好 - 但我会注意到,在研究这个时,我发现了这个链接:

FutureWarning: elementwise comparison failed; returning scalar instead

最佳答案是信息丰富的。我最好的猜测是,也许在您的实际数据中,一些整数被记录为字符串?

例如,看我下面的代码:

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

k=df_[((df_['Iteration']==df2['Iteration'][0]) & (df_['IP Weight']==df2['IP Weight'][0]))]

g=pd.concat([df2,k])

print(g)

通过将 df2 的第一行的迭代设为字符串,我可以重新创建您的错误。将其设为整数即可。

【讨论】:

以上是关于Pandas 系列字符串比较的主要内容,如果未能解决你的问题,请参考以下文章

Pandas之字符串操作

用 python pandas 比较两个字符串

如何在 Pandas 中使用 apply 并行化许多(模糊)字符串比较?

如何在 Pandas 中使用 apply 并行化许多(模糊)字符串比较?

如何在 Pandas 中使用 apply 并行化许多(模糊)字符串比较?

如何在 Pandas 中使用 apply 并行化许多(模糊)字符串比较?