我正在处理大型数据帧,其中包含具有唯一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']]
有没有办法调整这些函数来处理缺失的值?你知道吗
使用
pandas.fillna()
将nan
元素替换为数据帧中不存在的值(例如,如果只有正数,则替换-1
):将返回:
相关问题 更多 >
编程相关推荐