我有这样的数据:
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
我如何在熊猫中做到这一点?
答案 0 :(得分:1)
您可以将https://github.com/steveloughran/winutils与mask
一起使用,并通过[]
选择列:
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
编辑:
如果要检查重复项,只有第一栏id
将cols[:-2]
更改为id
而df.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