确定两个 python 系列或数据帧中的额外值

Determine extra value in two python series or dataframes

给定两个数据帧,我将一些唯一值提取到一个 groupby 中,然后我想比较两个唯一值并找到不同的值。

unit1 = ["U1", "U2", "U1", "U2", "U1", "U2"]
unit2 = ["U1", "U2", "U1", "U2", "U1", "U2, "U3"]
count1 = [2,4,6,8,10,12]

df = pd.DataFrame({'Unit': unit1,
                   'Count': count1})
df2 = pd.DataFrame({'Unit': unit2,
                   'Count': count1})

units_in_1 = df.groupby(['Unit'])
unit1_list = units_in_1['Unit'].unique()

units_in_2 = df2.groupby(['Unit'])
unit2_list = units_in_2['Unit'].unique()

我最终想要的是 U3,这样我就可以返回并在 df2 中找到它的所有实例。

unit1_list 是一个系列,我似乎什么都做不了。

创建列表并按照 this answer 进行交集失败,著名的 numpy not hashable

如果我尝试减法,我会得到 TypeError unsupported operand for str 和 str

请帮忙。

希望我理解你的问题。

如果 select df2['Unit] 的任何值不等于 df['Unit],它是否有效?

df2[df.Unit != df2.Unit ]

输出:

IIUC 然后你可以创建一个 set 的唯一值然后调用 difference:

In [161]:
combined = set(df['Unit'].unique().tolist()+df2['Unit'].unique().tolist())
combined

Out[161]:
{'U1', 'U2', 'U3'}

In [162]:    
combined.difference(df['Unit'].unique())

Out[162]:
{'U3'}

您可以将 isin() 与否定 (~) 运算符一起使用来实现此目的。

>>> stuff_in_df2_but_not_in_df1 = df2[~df2.Unit.isin(df1.Unit)]['Unit'].unique()
['U3']

这行有点神秘的代码告诉 Pandas 为您提供 df2['Unit'] 中不存在于 df1['Unit'] 中的所有项目。

如果您希望它在两个方向上都有效(即,您想要一个在 df1 但不在 df2 中的列表在 df2 中但不在 df1 中的内容,您可以使用 set.symmetric_difference()

如果 df1['Unit'] 包含 U1, U2, U4df2['Unit'] 包含 U1, U2, U3,则以下代码将为您提供包含 {'U3', 'U4'}set()

>>> set(df1.Unit.unique()).symmetric_difference(set(df2.Unit.unique()))
{'U3', 'U4'}