Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找数据帧中重复行的索引_Python_Pandas_Dataframe - Fatal编程技术网

Python 查找数据帧中重复行的索引

Python 查找数据帧中重复行的索引,python,pandas,dataframe,Python,Pandas,Dataframe,在给定的数据帧中查找相同行的索引而不迭代单个行的方法是什么 虽然可以使用unique=df[df.duplicated()]查找所有唯一行,然后使用unique.iterrows()迭代唯一项,并借助pd.where()提取相等项的索引,但其方法是什么 示例: 给定以下结构的数据帧: | param_a | param_b | param_c 1 | 0 | 0 | 0 2 | 0 | 2 | 1 3 | 2 | 1 |

在给定的数据帧中查找相同行的索引而不迭代单个行的方法是什么

虽然可以使用
unique=df[df.duplicated()]
查找所有唯一行,然后使用
unique.iterrows()
迭代唯一项,并借助
pd.where()
提取相等项的索引,但其方法是什么

示例: 给定以下结构的数据帧:

  | param_a | param_b | param_c
1 | 0       | 0       | 0
2 | 0       | 2       | 1
3 | 2       | 1       | 1
4 | 0       | 2       | 1
5 | 2       | 1       | 1
6 | 0       | 0       | 0
输出:

[(1, 6), (2, 4), (3, 5)]
对所有重复行使用参数
keep=False
,然后对所有列使用参数
groupby
,并将索引值转换为元组,最后将输出
系列
转换为
列表

df = df[df.duplicated(keep=False)]

df = df.groupby(list(df)).apply(lambda x: tuple(x.index)).tolist()
print (df)
[(1, 6), (2, 4), (3, 5)]
如果还希望看到重复的值:

df1 = (df.groupby(df.columns.tolist())
       .apply(lambda x: tuple(x.index))
       .reset_index(name='idx'))
print (df1)
   param_a  param_b  param_c     idx
0        0        0        0  (1, 6)
1        0        2        1  (2, 4)
2        2        1        1  (3, 5)
方法#1

以下是一种矢量化方法,其灵感来自-

样本运行-

In [42]: df
Out[42]: 
   param_a  param_b  param_c
1        0        0        0
2        0        2        1
3        2        1        1
4        0        2        1
5        2        1        1
6        0        0        0

In [43]: group_duplicate_index(df)
Out[43]: [[1, 6], [3, 5], [2, 4]]
方法#2

对于整数编号的数据帧,我们可以将每一行减少为一个标量,这样就可以使用
1D
数组,从而获得更高性能的数组,如下所示-

def group_duplicate_index_v2(df):
    a = df.values
    s = (a.max()+1)**np.arange(df.shape[1])
    sidx = a.dot(s).argsort()
    b = a[sidx]

    m = np.concatenate(([False], (b[1:] == b[:-1]).all(1), [False] ))
    idx = np.flatnonzero(m[1:] != m[:-1])
    I = df.index[sidx].tolist() 
    return [I[i:j] for i,j in zip(idx[::2],idx[1::2]+1)]

运行时测试

其他方法-

时间安排-

In [274]: df = pd.DataFrame(np.random.randint(0,10,(100000,3)))

In [275]: %timeit group_duplicate_index(df)
10 loops, best of 3: 36.1 ms per loop

In [276]: %timeit group_duplicate_index_v2(df)
100 loops, best of 3: 15 ms per loop

In [277]: %timeit groupby_app(df) # @jezrael's soln
10 loops, best of 3: 25.9 ms per loop

我尝试了您的解决方案,当它与玩具示例一起工作时,当我尝试在自己的数据帧上使用它时,它抛出了错误AttributeError:“DataFrame”对象没有属性“tolist”。您的解决方案中是否有特定于只包含数字的DFs的内容(我的DF条目主要是字符串)?
def groupby_app(df): # @jezrael's soln
    df = df[df.duplicated(keep=False)]
    df = df.groupby(df.columns.tolist()).apply(lambda x: tuple(x.index)).tolist()
    return df
In [274]: df = pd.DataFrame(np.random.randint(0,10,(100000,3)))

In [275]: %timeit group_duplicate_index(df)
10 loops, best of 3: 36.1 ms per loop

In [276]: %timeit group_duplicate_index_v2(df)
100 loops, best of 3: 15 ms per loop

In [277]: %timeit groupby_app(df) # @jezrael's soln
10 loops, best of 3: 25.9 ms per loop