python在多个列中找到重复的值,并忽略NaN

问题描述 投票:0回答:1

我是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”开头的列中出现相同名称的时刻,然后返回两个城市年份,因此它看起来像这样:

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值。但是也无法弄清楚如何在多个列中查找重复项。

python pandas duplicates mask
1个回答
0
投票
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
© www.soinside.com 2019 - 2024. All rights reserved.