python - 减少多列中的多个ID

标签 python pandas

我有一个布局如下的 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 都存在于两行中,我需要检查每一行并删除其中一行。目前我有一个解决方案,它是行迭代并且有点慢。

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

决赛 table 将如下所示:

id1 id2  var1 var2
12a 16e  66   1.0
13b 17f  9    2.0
14c 18g  48   NaN
15d 19h  13   3.0

所有“快速”的解决方案都受到高度评价。

最佳答案

我相信可以对每行的列进行排序,并按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

关于python - 减少多列中的多个ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50001525/

相关文章:

python - python 中接收用户输入并返回总和和平方的函数

python - 如何在 pygame 中生成多个敌人

python - Python 中的 Euler 项目 #3

pandas - 多索引 DataFrame 的多面图

python - 使用 Pandas 自定义显示时间序列数据

python - 查找两个文档之间的相似句子并计算整个文档中每个部分的相似度得分

python - 有没有办法将 timedelta 对象格式化为小时-分钟-秒.MILLISECONDS?

python - 根据另一个表中的多个列在一个表中创建一列 [python]

python - 按时间过滤 Pandas 数据框(不是日期)

python - 有什么简单的方法可以从 pandas.dtypes.to_dict() 中删除 dtype 吗?