在pandas数据框中找到所有重复的列,然后按键对它们进行分组

时间:2019-02-08 00:34:19

标签: python pandas

给定一个数据框,我想找到所有重复的列(列名不同,值相同),然后按关键字将它们分组为字典。我有一个解决方案,但是它涉及嵌套的for循环,我当时想应该有一种方法可以在熊猫中更优雅或更直接地做到这一点。我正在使用remove duplicate columns...作为当前解决方案的一部分。这个find duplicates in list...听起来和我的问题类似,但是回答了一个不同的问题。我最初的应用程序是为丢失的数据创建掩码列,并能够对具有相同丢失数据模式的所有列使用单个掩码列。

df = pd.DataFrame({'col1':[0,1,2,3,4],'col2':[1,0,0,0,1],'col3':[1,0,0,0,1],'col4':[1,0,1,0,1],'col5':[1,0,1,0,1],'col6':[1,1,1,0,1],'col7':[1,0,0,0,1] })
dup_cols = df.T.drop_duplicates().T.columns.tolist()
tmp_dict = {}
for col in dup_cols:
    tmp[col] = []
for col in dup_cols:
    check_cols = [c for c in df.columns if c != col]
    for c in check_cols:
        if np.array_equal(df[col].values,df[c].values):
            tmp_dict[col].append(c)

>>>tmp_dict
{'col1': [], 'col2': ['col3', 'col7'], 'col4': ['col5'], 'col6': []}

1 个答案:

答案 0 :(得分:1)

您可以使用除第一列之外的所有列进行分组(因为它对应于原始列名称),然后使用dictionary comprehensionextended iterable unpacking构建预期结果:

import pandas as pd

df = pd.DataFrame({'col1': [0, 1, 2, 3, 4], 'col2': [1, 0, 0, 0, 1], 'col3': [1, 0, 0, 0, 1], 'col4': [1, 0, 1, 0, 1],
                   'col5': [1, 0, 1, 0, 1], 'col6': [1, 1, 1, 0, 1], 'col7': [1, 0, 0, 0, 1]})

transpose = df.T

# build all column list but the first
columns = list(range(1, len(df)))

# build result iterating over groups
result = {head: tail for _, (head, *tail) in transpose.reset_index().groupby(columns).index}

print(result)

输出

{'col1': [], 'col4': ['col5'], 'col6': [], 'col2': ['col3', 'col7']}