我正在使用大型 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']]
是否有一种方法可以使这些功能适应缺失值?
答案 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