在数据框架集合中找到所有重复的列

时间:2018-07-02 09:53:33

标签: python pandas dataframe duplicates

具有一组数据帧,目标是识别重复的列名并将其作为列表返回。

示例

输入是3个数据帧df1df2df3

df1 = pd.DataFrame({'a':[1,5], 'b':[3,9], 'e':[0,7]})

   a  b  e
0  1  3  0
1  5  9  7

df2 = pd.DataFrame({'d':[2,3], 'e':[0,7], 'f':[2,1]})

   d  e  f
0  2  0  2
1  3  7  1

df3 = pd.DataFrame({'b':[3,9], 'c':[8,2], 'e':[0,7]})

   b  c  e
0  3  8  0
1  9  2  7

输出为列表[b, e]

2 个答案:

答案 0 :(得分:2)

pd.Series.duplicated

由于您使用的是熊猫,因此可以在串联列名称后使用pd.Series.duplicated

# concatenate column labels
s = pd.concat([df.columns.to_series() for df in (df1, df2, df3)])

# keep all duplicates only, then extract unique names
res = s[s.duplicated(keep=False)].unique()

print(res)
array(['b', 'e'], dtype=object)

pd.Series.value_counts

或者,您可以提取一系列计数并标识计数大于1的行。

s = pd.concat([df.columns.to_series() for df in (df1, df2, df3)]).value_counts()

res = s[s > 1].index

print(res)
Index(['e', 'b'], dtype='object')

collections.Counter

经典的Python解决方案是使用collections.Counter,然后使用列表推导。回想一下list(df)返回数据帧中的列,因此我们可以使用此mapitertools.chain来生成可迭代的数据源Counter

from itertools import chain
from collections import Counter

c = Counter(chain.from_iterable(map(list, (df1, df2, df3))))

res = [k for k, v in c.items() if v > 1]

答案 1 :(得分:0)

这是我针对此问题的代码,用于仅与两个数据帧进行比较,而不进行连接。

def getDuplicateColumns(df1, df2):
    df_compare = pd.DataFrame({'df1':df1.columns.to_list()})
    df_compare["df2"] = ""
    # Iterate over all the columns in dataframe
    for x in range(df1.shape[1]):
        # Select column at xth index.
        col = df1.iloc[:, x]
        # Iterate over all the columns in DataFrame from (x+1)th index till end
        duplicateColumnNames = []
        for y in range(df2.shape[1]):
            # Select column at yth index.
            otherCol = df2.iloc[:, y]
            # Check if two columns at x y index are equal
            if col.equals(otherCol):                
                duplicateColumnNames.append(df2.columns.values[y])
                df_compare.loc[df_compare["df1"]==df1.columns.values[x], "df2"] = str(duplicateColumnNames)

    return df_compare