将数据帧中的重复列名与缺少的值分组

2024-09-28 22:04:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在处理大型数据帧,其中包含具有唯一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']]

有没有办法调整这些函数来处理缺失的值?你知道吗


Tags: falsedfreturndefnpgroupnan解决方案
1条回答
网友
1楼 · 发布于 2024-09-28 22:04:14

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

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

相关问题 更多 >