熊猫系列琴弦比较

时间:2020-07-20 07:46:24

标签: python-3.x pandas dataframe

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

可重现的玩具示例如下:

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

我们非常感谢您的帮助。

2 个答案:

答案 0 :(得分: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 第一行中的索引如何,它都可以工作。

答案 1 :(得分:1)

因此,当我在笔记本中运行类似您的示例的内容时,正如您所说的那样,它可以正常运行-但我会注意到在研究此内容时,我找到了以下链接:

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第一行的迭代作为字符串,我可以重新创建您的错误。将其设为整数即可使用。