【问题标题】:Determine extra value in two python series or dataframes确定两个 python 系列或数据帧中的额外值
【发布时间】:2016-02-11 01:23:52
【问题描述】:

给定两个数据框,我将一些唯一值提取到 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 不可散列

如果我尝试减法,我会得到类型错误不支持 str 和 str 的操作数

请帮忙。

【问题讨论】:

  • 我使用了来自@chinmay 的解决方案,因为它教会了我更多关于 python 的知识。我没有尝试 edchum 的解决方案,但它看起来确实可行。

标签: python numpy pandas dataframe series


【解决方案1】:

您可以使用 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, U4 并且df2['Unit'] 包含U1, U2, U3,则以下代码将为您提供包含{'U3', 'U4'}set()

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

【讨论】:

  • 这样就行了。这很简单,无论如何都是一条线,我想我明白它是如何工作的。当我必须接近但不准确的东西时,我会知道我已经学会了,我可以将那个 sn-p 翻译成其他东西。非常感谢。
【解决方案2】:

希望我能理解您的问题。

如果您选择任何不等于 df['Unit] 的 df2['Unit] 值,它会起作用吗?

df2[df.Unit != df2.Unit ]

输出:

【讨论】:

  • 不,这不起作用。我在制作示例方面做得不好,我使列表大小相同。真实数据大小不一。
【解决方案3】:

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'}

【讨论】:

    猜你喜欢
    • 2022-01-13
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    • 2023-01-27
    • 2021-03-17
    相关资源
    最近更新 更多