【问题标题】:Reduce multiple IDs in multiple columns减少多列中的多个ID
【发布时间】:2018-04-24 20:46:10
【问题描述】:

我有一个布局如下的 DF。实际表在 +10m 行的范围内,因此在较大的一侧。

df = pd.DataFrame({'id1' : ['12a', '13b', '14c', '15d', '16e', '18g', '17f', '19h']
                     ,'id2' : ['16e', '17f', '18g', '19h','12a', '14c','13b', '15d']
                     ,'var1' : [i for i in range(8)]
                     ,'var2' : list(np.random.randint(100, size = 8))
                     ,'var3' : [1, 2, np.nan, 3, 2, np.nan, np.nan, 34]
     })
>>> df
   id1  id2  var1  var2  var3
0  12a  16e     0    66   1.0
1  13b  17f     1     9   2.0
2  14c  18g     2    48   NaN
3  15d  19h     3    13   3.0
4  16e  12a     4    67   2.0
5  18g  14c     5    88   NaN
6  17f  13b     6    92   NaN
7  19h  15d     7    99  34.0

我想要的是减少成对出现的 DF 中的 ID,例如id1 索引第 0 行和 id2 索引第 4 行。所有 id 都存在于两行中,我需要检查每一行并删除其中一行。目前我有一个解决方案,它是行迭代并且有点慢。

请注意,由于需要检查所有 ID(id1id2),因此不能只删除 DF 的下部(索引第 4 行及以后)。

决赛桌将如下所示:

id1 id2 var1 var2 12a 16e 66 1.0 13b 17f 9 2.0 14c 18g 48 南 15 天 19 小时 13 3.0

所有“快速”的解决方案都非常受欢迎。

【问题讨论】:

  • 我不明白。结果中var1 的值来自哪里?为什么var2 列消失了?删除两个匹配行中的哪一个是否重要?
  • 对代码进行了编辑,添加了执行的 DF 输出,给定执行和 np.random.randit 函数,数字发生了变化。对此感到抱歉

标签: python pandas


【解决方案1】:

我相信有可能对每行的列进行排序,并通过DataFrame.duplicated 过滤第一行,boolean indexing 并通过~ 反转掩码:

np.random.seed(2018)

df = pd.DataFrame({'id1' : ['12a', '13b', '14c', '15d', '16e', '18g', '17f', '19h']
                     ,'id2' : ['16e', '17f', '18g', '19h','12a', '14c','13b', '15d']
                     ,'var1' : [i for i in range(8)]
                     ,'var2' : list(np.random.randint(100, size = 8))
                     ,'var3' : [1, 2, np.nan, 3, 2, np.nan, np.nan, 34]
})

df = df[~pd.DataFrame(np.sort(df[['id1', 'id2']], 1)).duplicated()]
print (df)
   id1  id2  var1  var2  var3
0  12a  16e     0    62   1.0
1  13b  17f     1    59   2.0
2  14c  18g     2    58   NaN
3  15d  19h     3    72   3.0

详情

print (pd.DataFrame(np.sort(df[['id1', 'id2']], 1)))
     0    1
0  12a  16e
1  13b  17f
2  14c  18g
3  15d  19h
4  12a  16e
5  14c  18g
6  13b  17f
7  15d  19h

print (~pd.DataFrame(np.sort(df[['id1', 'id2']], 1)).duplicated())
0     True
1     True
2     True
3     True
4    False
5    False
6    False
7    False
dtype: bool

【讨论】:

  • 是的,那个把它从水里吹出来了!感谢您的输入,对轴 = 1 和布尔值进行简单而智能的排序,没想到那样。
猜你喜欢
  • 2021-11-01
  • 2011-07-31
  • 1970-01-01
  • 2012-04-07
  • 1970-01-01
  • 2020-12-02
  • 1970-01-01
  • 2022-01-02
  • 2016-10-31
相关资源
最近更新 更多