【问题标题】:Identifying the columns having duplicate column value with Different column name in python在python中使用不同的列名识别具有重复列值的列
【发布时间】:2020-04-08 16:05:39
【问题描述】:

如何识别具有相同column_value 的数据框中的列但是对于不同的列名,我们需要列出这两个列,这里我只能列出其中一个。

    from pandas import DataFrame
    import numpy as np
    import pandas as pd

raw_data = {
        'id': ['1', '2', '2', '3', '3'],
        'name': ['A', 'B', 'B', 'C', 'D'],
        'age' : [1, 2, 2, 3, 3],
'name_dup': ['A', 'B', 'B', 'C', 'D'],
'age_dup': [1, 2, 2, 3, 3]}
df = pd.DataFrame(raw_data, columns = ['id', 'name','age','name_dup','age_dup'])

如图所示,可以观察到 namename_dup 具有相同的列值,但列名不同使用以下函数,我只能得到 name 作为输出,如下所示name_dup

    def duplicate_columns(frame):
    groups = frame.columns.to_series().groupby(frame.dtypes).groups
    dups = []

    for t, v in groups.items():

        cs = frame[v].columns
        vs = frame[v]
        lcs = len(cs)

        for i in range(lcs):
            iv = vs.iloc[:,i].tolist()
            for j in range(i+1, lcs):
                jv = vs.iloc[:,j].tolist()
                if iv == jv:
                    dups.append(cs[i])
                    break

    return dups 

 duplicate_columns(df)

以上代码的输出如下所示:

预期列表重复列输出

namename_dup ageage_dup

如果我们有列名列表,请继续删除任何一列并从list_check重命名新列:

list_check  =  ['name','age']  

预期的数据帧

注意:不一定总是colnamecolname_dup,也可以是lname

【问题讨论】:

  • 我在代码中没有看到age_dup

标签: python python-3.x pandas dataframe duplicates


【解决方案1】:

你的意思是:

s = df.T.duplicated().reset_index()
vals = s.loc[s[0], 'index'].tolist()
colk = df.columns.drop(vals)
print(vals)
print(colk)
print(df.drop(vals, axis=1))

输出:

['name_dup', 'age_dup']
['id', 'name', 'age']
  id name  age
0  1    A    1
1  2    B    2
2  2    B    2
3  3    C    3
4  3    D    3

【讨论】:

  • 预期值是 ['name','name_dup','age', 'age_dup']
  • @NabiShaikh 这不是你想要的吗?
  • 数据框输出是完美的,但我也想知道其他列的名称,因为从这段代码中我知道name 是重复列,但如果在其他列中是名称,例如' colk' 所以这将是一个很好的信息,有人用不同的列名称命名了一个类似的内容列值 colk
  • @NabiShaikh 编辑得更好?
  • 这很好理解什么时候您的数据集的列数很少,但如果列数超过 100 列,如果我想识别 name_dup 和 name 具有相同的列值但列名是不同的 。那样的话就很难理解了。我们可以通过任何方式以不同的方式列出列,例如 name 和 name_dup 具有相同的列值。会更精确..
【解决方案2】:

你可以试试这个:

df.T.drop_duplicates().T

输出:

  id name age
0  1    A   1
1  2    B   2
2  2    B   2
3  3    C   3
4  3    D   3

【讨论】:

  • 是的,这是最终结果,但命名应按照list_check 我们还希望列出所有具有公共列值的列
猜你喜欢
  • 1970-01-01
  • 2018-04-11
  • 2012-06-29
  • 2020-08-20
  • 2017-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多