在pandas DataFrame中将重复的列名称分组,缺少值

时间:2018-07-23 09:04:26

标签: python pandas dataframe duplicates nan

我正在使用大型 DataFrames ,其中包含具有唯一ID但重复值的列。这些列是通过df.T.drop_duplicates().T删除的,但是我需要知道哪些列是等效的。

示例:

import pandas as pd
import numpy as np
df = pd.DataFrame({'A': [1, 2, 3, 4, 5],'B': [2, 4, 2, 1, 9], 'C': [1, 2, 3, 4, 5],'D': [2, 4, 2, 1, 9], 'E': [3, 4, 2, 1, 2],'F': [1, 1, 1, 1, 1],'G': [1, 1, 1, 1, np.nan],'H': [1, 1, 1, 1, np.nan], 'I': [1, 2, 3, np.nan, 5]}, dtype=np.float64)

print(df)
     A    B    C    D    E    F    G    H    I
0  1.0  2.0  1.0  2.0  3.0  1.0  1.0  1.0  1.0
1  2.0  4.0  2.0  4.0  4.0  1.0  1.0  1.0  2.0
2  3.0  2.0  3.0  2.0  2.0  1.0  1.0  1.0  3.0
3  4.0  1.0  4.0  1.0  1.0  1.0  1.0  1.0  NaN
4  5.0  9.0  5.0  9.0  2.0  1.0  NaN  NaN  5.0

找到here的几个有效解决方案,对于包含np.nan的列不返回任何内容:

第一个解决方案:

def group_duplicate_rows(df):
    a = df.values
    sidx = np.lexsort(a.T)
    b = a[sidx]

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

In  [19]: group_duplicate_cols(df)
Out [19]: [['A', 'C'], ['B', 'D']]

第二个解决方案:

def view1D(a): # a is array
    a = np.ascontiguousarray(a)
    void_dt = np.dtype((np.void, a.dtype.itemsize * a.shape[1]))
    return a.view(void_dt).ravel()

def group_duplicate_cols_v2(df):
    a = df.values
    sidx = view1D(a.T).argsort()
    b = a[:,sidx]

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

In  [20]: group_duplicate_cols_v2(df)
Out [20]: [['B', 'D'], ['A', 'C']]

是否有一种方法可以使这些功能适应缺失值?

1 个答案:

答案 0 :(得分:0)

使用nan,将-1元素替换为数据框中不存在的某些值(例如pandas.fillna(),如果您只有正数):

df.fillna(-1, inplace=True)

会返回:

    A    B    C    D    E    F    G    H    I
0  1.0  2.0  1.0  2.0  3.0  1.0  1.0  1.0  1.0
1  2.0  4.0  2.0  4.0  4.0  1.0  1.0  1.0  2.0
2  3.0  2.0  3.0  2.0  2.0  1.0  1.0  1.0  3.0
3  4.0  1.0  4.0  1.0  1.0  1.0  1.0  1.0 -1.0
4  5.0  9.0  5.0  9.0  2.0  1.0 -1.0 -1.0  5.0