Python 查找数据帧中的所有重复列,然后按键对它们进行分组

Python 查找数据帧中的所有重复列,然后按键对它们进行分组,python,pandas,Python,Pandas,给定一个数据帧,我希望找到所有重复的列(列名不同,值相同),然后按键将它们分组到字典中。我有一个解决方案,但它涉及到一个嵌套的for循环,我想应该有一种方法可以更优雅地或直接地在pandas中实现这一点。我正在使用作为我当前解决方案的一部分。这听起来与我的问题相似,但回答了一个不同的问题。我的原始应用程序是为丢失的数据创建掩码列,并能够为具有相同丢失数据模式的所有列使用单个掩码列 df = pd.DataFrame({'col1':[0,1,2,3,4],'col2':[1,0,0,0,1],'

给定一个数据帧,我希望找到所有重复的列(列名不同,值相同),然后按键将它们分组到字典中。我有一个解决方案,但它涉及到一个嵌套的for循环,我想应该有一种方法可以更优雅地或直接地在pandas中实现这一点。我正在使用作为我当前解决方案的一部分。这听起来与我的问题相似,但回答了一个不同的问题。我的原始应用程序是为丢失的数据创建掩码列,并能够为具有相同丢失数据模式的所有列使用单个掩码列

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': []}

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

输出

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

如果您还没有这样做,我建议您查看
df.fillna()
以替换NaN。您可以为每列指定一个单独的填充值,因此可能不需要创建掩码。@WolfgangK我不认为这对OP的问题有什么帮助……我不太理解您的最终目标,但我认为您可以通过定义
df1=df.t
来简化一切,然后您可以执行
df1.drop\u duplicates()
并在最后进行转置。您能否添加一些关于词典理解如何与扩展iterable解包一起工作的详细信息?试着让我的头围绕着它。我认为需要
*尾巴
,但我对
感到困惑,{uuuu,(头,*尾巴)
@ZakKeirn the
。。。groupby(columns).index
返回一个键,值元组,在您的例子中,您只关心值,因此键的u,这意味着您不关心该元素。我理解此解决方案的关键是打印“list”(transpose.reset_index().groupby(columns).index)`并注意结构。
{'col1': [], 'col4': ['col5'], 'col6': [], 'col2': ['col3', 'col7']}