【问题标题】:Pandas DataFrame: Replacing column values with next column values to avoid duplicationPandas DataFrame:用下一列值替换列值以避免重复
【发布时间】:2020-12-17 14:37:52
【问题描述】:

我有一个包含数百行和 10 列的 Pandas DataFrame。每行代表一个唯一的 ID,每列代表 k 个最近邻索引。也就是说,第一列是 ID 的最近邻居的索引,第二列是第二最近的邻居,以此类推,一直到第 10 个最近的邻居。

但是,第一列有一些重复,因为有几个 ID 共享一个共同的最近邻居。但是,我想找到每个 ID 的最近邻索引,但不能重复。因此,例如,如果前两个 ID 共享最近的邻居,那么我想使用第二列来查找第二个 ID 的非重复最近邻居。例如,如果我的 DataFrame 如下所示:

         NN1        NN2        NN3      ... NN10
1       1           3          8
2       1           5          9
3       1           5          2
4       3           8          1

那么结果就是:

         NN_no_dup      
1        1
2        5 
3        2
4        3

在我的示例中,据我所知,在使用第 10 个最近邻后,似乎没有出现重复项(如果有,我可以简单地增加最近邻的数量)使用)。

【问题讨论】:

  • 如果假设下一个 ID=5 会发生什么,你的 NN 的顺序是 10,3,11,...你保留哪一个,知道在第 ID=3 行,在NN_no_dup 你现在有 10 个,而在原点,10 不在第一列 NN1
  • 我会使用 11,因为它尚未在 NN_no_dup 中使用。

标签: python pandas duplicates


【解决方案1】:

这可能有效,尽管它肯定不是最优雅的方式:

a = pd.DataFrame(....)

used_list = []

for i in range(a.shape[0]):
    if np.isin(a.iloc[i,0],used_list):
        take_column = ~np.isin(a.iloc[i], used_list)
        a.iloc[i,0] = a.iloc[i,np.argmax(take_column)]
        
    used_list.append(a.iloc[i,0])

【讨论】:

  • 对不起,我应该指定id索引没有特定的顺序,所以做argmax是不够的。我已经编辑了这个问题来解决这个问题。
  • 我最终只做了一个 10 级的 for 循环,因此问题解决了,因为我不必再次运行脚本。不过,如果有人对这个问题有答案,那么找出它是如何解决的会很有趣。
  • 为什么索引的顺序很重要? argmax 用于选择尚未显示为 NN1 的行中最近的邻居。
猜你喜欢
  • 1970-01-01
  • 2019-07-16
  • 2014-06-12
  • 1970-01-01
  • 2013-09-12
  • 1970-01-01
相关资源
最近更新 更多