【问题标题】:Matching different items from two columns匹配两列中的不同项目
【发布时间】:2022-01-26 17:29:11
【问题描述】:

假设我们在(目标)之前和之后有以下数据框。我想确保没有两个列值在一起(如果它们具有来自数据框中Label 列的相同标签值)。下面是 4 行的示例,其中 (1, 10) 在一起,因为它们具有相同的标签,但我想要相反的情况,即 Column 1Column 2 不能具有相同的标签,因此 1 可以与 @ 987654329@ 或 13 和其他人一样。

此外,基于Label 1 值,来自column 1 的相同值不能与来自column 2 的多个不同项目配对,所以我假设我们在操作后得到(1,11) 而不是@987654335 @ 和 (1,13) 行。

我的方法如下。我使用groupby('Label')cumcount() 添加另一列来解决第一个问题,即有两个匹配(1, 11)(1,13),例如我只能有一个(1, 11),但我不知道如何做另一个,即匹配具有不同 Label 值的行以及最多匹配一次的约束。

示例

import pandas as pd

df1 = pd.DataFrame(
    {
        'Column1': [1,2,3,4],
        'Column2':[10,11,12,13],
        'Label':['apple', 'orange', 'apple', 'orange']
    }
)

target = pd.DataFrame(
    {
        'Column1': [1,2,3,4],
        'Column2':[11,10,13,12],
        'Label':['apple', 'orange', 'apple', 'orange']
    }
)

【问题讨论】:

  • 我在遵循您的逻辑时遇到了一些麻烦。 (1, 13) 也可以是第一行吗?
  • @DerekO。是的,德里克。这是可能的,但我只是在 col 1col 2 列之间寻找一个匹配,这样它们的标签就不同了,这就足够了。所以我们 cab 只有(1, 13)(1, 11),但在目标数据帧中没有浴。我认为cumcount 可能会解决(1, 13)(1, 11) 的第一个问题。
  • 这个问题/答案对您有帮助吗:stackoverflow.com/questions/69518646/…
  • @保罗。谢谢你。这也是我的问题,但它是不同的,因为它应该匹配两列中的行,这样我们就可以避免重复,并且我们根据具有共同值的共享列来匹配行。在这里,我想通过匹配 Label 不同的行来做相反的事情,这样我最多只有一个匹配。

标签: python pandas


【解决方案1】:

需要O(n^2) 的蛮力回答,仍在努力变得更好:

for i in range(len(df1_col1)):
    for j in range(len(df1_col2)) :
        if((df1_col1["Label"].iloc[i] != df1_col2["Label"].iloc[j]) and (df1_col2["Label"].iloc[j] != "NaN")):
            match = {'Column1': df1_col1["Column1"].iloc[i], 'Column2': df1_col2["Column2"].iloc[j]}
            print(match)
            df1_col2["Label"].iloc[j] = "NaN"
            result.append(match, ignore_index=True)
            break

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多