在 numpy [复制] 中快速找到对称对

共6个回答,已解决, 标签: python pandas numpy

这个问题已经有了答案:

如何在数据框中删除值顺序不重要的行(2 个答案)

从迭代工具导入产品
进口熊猫作为 pd

Df = pd.DataFrame.From _ records (产品 (范围 (10),范围 (10)
Df = df.sample (90)
Df.columns = "c1 c2".split ()
Df = df.sort_values (df.columns.tolist ()).reset_index (drop = True)
# C1 c2
#0
#1 0 1
#2 0 2
#3 0 3
#4 0 4
#.
#85 9 4
#86 9 5
#87 9 7
#88 9 8
#89 9 9
#
#[90 行 x 2 列]

如何快速找到并删除此数据帧中所有对称对的最后一个副本?

对称对我的意思是(0, 1) is equal to (1, 0)。后者应该被移除。

它需要快速,所以 numpy 解决方案受到赞赏。请不要转换为 python 对象 :)

第1个答案(采用)

您可以对值进行排序,然后groupby:

A = np.sort (df.to_numpy (),轴 = 1)
Df.groupby ([a [:,0],a [:,1]],as_index = 假,sort = 假)。第一 ()

选项 2: 如果你有很多对c1, c2, groupby can be slow. In that case, we can assign new values and filter by drop_duplicates:

A = np.sort (df.to_numpy (),轴 = 1)

(Df.assign (一 = a [:,0],二 = a [:,1]) # 一和二可以更改
。Drop _ duplicates (['one','two']) # 取自上面
。重新索引 (df.columns,轴 = 1)
)
第2个答案

frozenset

Mask = pd.Series (map (frozenset,zip (df.c1,df.c2)。重复 ()

Df [~ mask]
第3个答案

我会做

Df [~ pd.DataFrame (np.sort (df.values,1))。重复 ()。值]

来自熊猫和 numpy tri

S = pd.crosstab (df.c1,df.c2)
S = s.mask (np.triu (np.One (s.shape)).astype (np.bool) & s = = 0).stack ().reset_index ()
第4个答案

一种方法是使用np.unique with return_index=True并使用结果来索引数据帧:

A = np.sort (df.values)
_,Ix = np.unique (a,return_index = True,axis = 0)

打印 (df.iloc [ix,:])

C1 c2
0
1 0 1
20 2 0
3 0 3
40 4 0
50 5 0
6 0 6
70 7 0
8 0 8
9 0 9
11 1 1
21 2 1
13 1 3
41 4 1
51 5 1
16 1 6
71 7 1
...
第5个答案

这里有一个基于 NumPy 的整数-

Def remove_symm_pairs (df):
A = df.to_numpy (复制 = 假)
B = np.sort (a,轴 = 1)
Idx = np.ravel_multi_index (b.T,(b.max (0) 1))
Sidx = idx.argsort (kind = 'mergesort')
P = idx [sidx]
M = np.r _ [真,p [:-1]!= p [1:]
A_out = a [np.sort (sidx [m])]
Df_out = pd.DataFrame (a_out)
返回 df_out

如果要保持索引数据不变,请使用return df.iloc[np.sort(sidx[m])]

对于通用数字 (整数/浮点数等),我们将使用view-based一-

# Https://stackoverflow.com/a/44999009/ @ Divakar
Def view1D (a): # a 是数组
A = np.ascontiguousarray (a)
Void_dt = np.dtype ((np.void,a.dtype.itemsize * a.shape [1]))
返回 a.view (void_dt).ravel ()

简单地替换步骤来获得idx with idx = view1D(b) in remove_symm_pairs

第6个答案

如果这需要快速,如果你的变量是整数,那么下面的技巧可能会有所帮助:v,w be the columns of your vector; construct [v w, np.abs(v-w)] =: [x, y]; then sort this matrix lexicographically, remove duplicates, and finally map it back to [v, w] = [(x y), (x-y)]/2

相关问题

通过随机抽样其他列数据创建新列 如何使用熊猫获得包括每一个组合的计数 如何有效地展开矩阵的值与小块? 如何破坏 Python 对象并释放内存 将具有特殊格式的文本文档转换为熊猫数据框架 用两本字典绘制一只熊猫专栏图 将一个六位数的数字列拆分为分隔的列,保留一位数的 [] Numpy 1D 数组: 重复超过 n 次的屏蔽元素 在 numpy [复制] 中快速找到对称对