从数据框中删除重复的行,不包括最后两列python pandas

时间:2017-06-25 09:57:55

标签: python pandas

我有这样的数据:

id    city  age  gender  Child  Generation_group   Bodytag   RecordType 
2001   A    2      M      0      ABCD               WW        AW
2002   A    2      M      0      ABCD               AA        WA
2002   A    2      M      0      ABCD               BB        AW
2002   A    2      M      0      ABCD               CC        WA
2004   A    2      M      0      ABCD               DD        AW
2004   A    2      M      0      ABCD               EE        WA
2005   A    2      M      0      ABCD               FF        AW
2005   A    2      M      0      ABCD               QQ        WA

我想要这样的输出:

id    city  age  gender  Child  Generation_group   Bodytag   RecordType 
2001   A    2      M      0      ABCD               WW        AW
2002   A    2      M      0      ABCD               AA        WA
2002   Null Null   Null   Null   Null               BB        AW
2002   Null Null   Null   Null   Null               CC        WA
2004   A    2      M      0      ABCD               DD        AW
2004   Null Null   Null   Null   Null               EE        WA
2005   A    2      M      0      ABCD               FF        AW
2005   Null Null   Null   Null   Null               QQ        WA

我想要空值,其中有重复的ID,但只在id列之后的前5列中,我不希望在最后两列中为null

我如何在熊猫中做到这一点?

2 个答案:

答案 0 :(得分:1)

您可以将https://github.com/steveloughran/winutilsmask一起使用,并通过[]选择列:

cols = df.columns
df[cols[1:-2]] = df[cols[1:-2]].mask(df[cols[:-2]].duplicated())
print (df)
     id city  age gender  Child Generation_group Bodytag RecordType
0  2001    A  2.0      M    0.0             ABCD      WW         AW
1  2002    A  2.0      M    0.0             ABCD      AA         WA
2  2002  NaN  NaN    NaN    NaN              NaN      BB         AW
3  2002  NaN  NaN    NaN    NaN              NaN      CC         WA
4  2004    A  2.0      M    0.0             ABCD      DD         AW
5  2004  NaN  NaN    NaN    NaN              NaN      EE         WA
6  2005    A  2.0      M    0.0             ABCD      FF         AW
7  2005  NaN  NaN    NaN    NaN              NaN      QQ         WA

类似的解决方案:

cols = df.columns
df[cols[1:-2]] = df[cols[1:-2]].mask(df.duplicated(subset=cols[:-2]))
print (df)
     id city  age gender  Child Generation_group Bodytag RecordType
0  2001    A  2.0      M    0.0             ABCD      WW         AW
1  2002    A  2.0      M    0.0             ABCD      AA         WA
2  2002  NaN  NaN    NaN    NaN              NaN      BB         AW
3  2002  NaN  NaN    NaN    NaN              NaN      CC         WA
4  2004    A  2.0      M    0.0             ABCD      DD         AW
5  2004  NaN  NaN    NaN    NaN              NaN      EE         WA
6  2005    A  2.0      M    0.0             ABCD      FF         AW
7  2005  NaN  NaN    NaN    NaN              NaN      QQ         WA

duplicated的解决方案:

df.iloc[:, 1:-2] = df.iloc[:, 1:-2].mask(df.iloc[:, :-2].duplicated())
print (df)
     id city  age gender  Child Generation_group Bodytag RecordType
0  2001    A  2.0      M    0.0             ABCD      WW         AW
1  2002    A  2.0      M    0.0             ABCD      AA         WA
2  2002  NaN  NaN    NaN    NaN              NaN      BB         AW
3  2002  NaN  NaN    NaN    NaN              NaN      CC         WA
4  2004    A  2.0      M    0.0             ABCD      DD         AW
5  2004  NaN  NaN    NaN    NaN              NaN      EE         WA
6  2005    A  2.0      M    0.0             ABCD      FF         AW
7  2005  NaN  NaN    NaN    NaN              NaN      QQ         WA

编辑:

如果要检查重复项,只有第一栏idcols[:-2]更改为iddf.iloc[:, :-2].duplicated()更改为df.duplicated(subset=['id'])

答案 1 :(得分:0)

您可以使用df.duplicated查找重复的ID,并使用df.loc来选择子DataFrame。请注意,df.loc可以使用2个索引器 - df.duplicated('id', keep='first')通过布尔选择对行进行索引,df.columns[1:6]按标签选择列:

In [13]: df.loc[df.duplicated('id', keep='first'), df.columns[1:6]] = np.nan

In [14]: df
Out[14]: 
     id city  age gender  Child Generation_group Bodytag RecordType
0  2001    A  2.0      M    0.0             ABCD      WW         AW
1  2002    A  2.0      M    0.0             ABCD      AA         WA
2  2002  NaN  NaN    NaN    NaN              NaN      BB         AW
3  2002  NaN  NaN    NaN    NaN              NaN      CC         WA
4  2004    A  2.0      M    0.0             ABCD      DD         AW
5  2004  NaN  NaN    NaN    NaN              NaN      EE         WA
6  2005    A  2.0      M    0.0             ABCD      FF         AW
7  2005  NaN  NaN    NaN    NaN              NaN      QQ         WA