python 在多个列中查找重复值并忽略 NaN

python find duplicate values across multiple columns and ignore NaN

我是 python 的新手,但我不知所措。

我有一个如下所示的数据框:

import pandas as pd
df = pd.DataFrame({'cityyear': ['chicago1990', 'detroit2000', 'detroit1999', 'chicago1999', 'detroit1990'], 
               'name1': ['hayden', 'charles', 'daniel', 'james', 'hayden']
               'name2': ['mary', 'mary', 'john',NaN, NaN]
               'name3': ['edward', 'reynolds', 'paula', NaN, NaN]
               'name4': ['charles', 'louse', 'reynolds', NaN, NaN]
               'name5': ['allan', 'william', 'romulus', NaN, NaN]
               'name6': ['edmund', 'elizabeth', 'edmund', NaN, NaN]
               'name7':['jane', NaN, 'william', NaN, NaN]})

我想找到以 "name" 开头的列中出现相同名称的时刻,然后是 return 这两个 cityyears,因此它看起来像这样:

newdf=pd.DataFrame({'newcityyear': ['detroit2000','detroit2000'],
                'newcityear2': ['chicago1990', 'detroit1999'],
                'duplicatename1': ['charles', 'reynolds'],
                'duplicatename2': ['mary', 'william']})

我主要是想不通如何跨多个列查找重复项。我已经开始这样做了:

    mask= df[['name1', 'name2', 'name3', 'name4', 'name5', 'name6', 'name7']].mask(df.duplicated(['name1', 'name2', 'name3', 'name4', 'name5', 'name6', 'name7']))

这是行不通的。

但这也不是:

    df[df.duplicated(['name1', 'name2', 'name3', 'name4', 'name5', 'name6', 'name7'], keep=False)]

有什么帮助吗?我什至不确定如何处理我有 NaN 值的事实,我不想将其视为重复值。但也无法弄清楚如何跨多列查找重复项。

你能试试这个吗? 首先,我拆开堆栈以查找名称,并在删除空值后仅保留重复的名称。 然后将重复的名称分组并将它们转换为列表,然后将它们取消列出到列中

df = df.set_index(['cityyear']).unstack(['cityyear']).reset_index()
df = df[df[0].notnull()]
df = df[df.duplicated(subset = [0],keep=False)].sort_values([0])
df = df.groupby(['cityyear'])[0].agg(list).reset_index()
df.join(pd.DataFrame(df[0].tolist(),index=df.index).add_prefix('duplicatename'))



    cityyear    duplicatename0  duplicatename1  duplicatename2  duplicatename3
0   chicago1990 charles edmund  hayden  mary
1   detroit1990 hayden  None    None    None
2   detroit1999 edmund  reynolds    william None
3   detroit2000 charles mary    reynolds    william

这是我使用的数据框。

df = pd.DataFrame({'cityyear': ['chicago1990', 'detroit2000', 'detroit1999', 'chicago1999', 'detroit1990'], 
               'name1': ['hayden', 'charles', 'daniel', 'james', 'hayden'],
               'name2': ['mary', 'mary', 'john',np.nan, np.nan],
               'name3': ['edward', 'reynolds', 'paula', np.nan, np.nan],
               'name4': ['charles', 'louse', 'reynolds', np.nan, np.nan],
               'name5': ['allan', 'william', 'romulus', np.nan, np.nan],
               'name6': ['edmund', 'elizabeth', 'edmund', np.nan, np.nan],
               'name7':['jane', np.nan, 'william', np.nan, np.nan]})