给定测试数据集如下:
id city name
0 1 bj NaN
1 2 bj jack
2 3 bj NaN
3 4 bj jim
4 5 sh NaN
5 6 sh NaN
6 7 sh steve
7 8 sh fiona
8 9 sh NaN我如何通过city进行群群,为name删除NaN行,同时只为每个group保留一个行?非常感谢。
预期结果如下:
id city name
0 1 bj NaN
1 2 bj jack
2 4 bj jim
3 5 sh NaN
4 7 sh steve
5 8 sh fionadf = pd.read_clipboard(na_filter = False)从excel文件中读取的新数据集,请注意N/A不应被视为NaN
newcode build_name floor rent_id rent_name
0 1210010403 C栋 25 1765228 (株)有延商店上海事务所
1 1210010403 C栋 25 1765229 N/A
2 1210010403 C栋 25 1765229 N/A
3 1210010403 C栋 25 1765229 N/A
4 1210010403 C栋 25 1765230 上海皇瑾文化传媒有限公司
5 1210010403 C栋 25 1765229 N/A
6 1210010403 C栋 25 1765231 上海农邦实业有限公司
7 1210010403 C栋 25 1765232 N/A
8 1210010403 C栋 25 1765231 上海农NA邦实业有限公司代码:df[df['rent_name'].ne('N/A') | ~df.duplicated(subset=['newcode', 'build_name', 'floor'])],与df[~(df['rent_name'].eq('N/A') & df.duplicated(subset = ['newcode', 'build_name', 'floor'], keep = 'first'))]的结果相同
退出:
newcode build_name floor rent_id rent_name
0 1210010403 C栋 25 1765228 (株)有延商店上海事务所
4 1210010403 C栋 25 1765230 上海皇瑾文化传媒有限公司
6 1210010403 C栋 25 1765231 上海农邦实业有限公司
8 1210010403 C栋 25 1765231 上海农NA邦实业有限公司您可以看到结果中缺少一个N/A行,我不知道为什么。
期望产出:
newcode build_name floor rent_id rent_name
0 1210010403 C栋 25 1765228 (株)有延商店上海事务所
1 1210010403 C栋 25 1765229 N/A
4 1210010403 C栋 25 1765230 上海皇瑾文化传媒有限公司
6 1210010403 C栋 25 1765231 上海农邦实业有限公司
8 1210010403 C栋 25 1765231 上海农NA邦实业有限公司发布于 2020-12-18 07:05:07
用于每个city不缺少值或第一次重复值的链式条件,名称:
df = df[df['name'].notna() | ~df.duplicated(subset=['city', 'name'])]
print(df)
id city name
0 1 bj NaN
1 2 bj jack
3 4 bj jim
4 5 sh NaN
6 7 sh steve
7 8 sh fiona编辑:对于测试字符串,N/A使用Series.ne
df = df[df['name'].ne('N/A') | ~df.duplicated(subset=['city', 'name'])]
print(df)
id city name
0 1 bj N/A
1 2 bj jack
3 4 bj jim
4 5 sh N/A
6 7 sh steve
7 8 sh fiona如果要测试多个值,请使用带有反向掩码的Series.isin:
df = df[~df['name'].isin(['N/N','N/A']) | ~df.duplicated(subset=['city', 'name'])]
print(df)
id city name
0 1 bj N/A
1 2 bj jack
3 4 bj jim
4 5 sh N/A
6 7 sh steve
7 8 sh fiona编辑:
df = df[df['name'].notna() | ~df.duplicated(subset=['city', 'name'])]
print(df)
id city name
0 1 bj NaN
1 2 bj jack
3 4 bj jim
4 5 sh NaN
6 7 sh steve
7 8 sh fiona
9 10 gz NaNEDIT1:对于重复的测试,必须使用NaN添加列,此处为rent_name
df = df[df['rent_name'].ne('N/A') |
~df.duplicated(subset=['newcode', 'build_name', 'floor', 'rent_name'])]
print (df)
newcode build_name floor rent_id rent_name
0 1210010403 C栋 25 1765228 (株)有延商店上海事务所
1 1210010403 C栋 25 1765229 N/A
4 1210010403 C栋 25 1765230 上海皇瑾文化传媒有限公司
6 1210010403 C栋 25 1765231 上海农邦实业有限公司
8 1210010403 C栋 25 1765231 上海农NA邦实业有限公司发布于 2020-12-18 07:02:04
布尔选择NaNs,删除在name和city中复制的最后一个
df[~(df.name.isna() & df.duplicated(subset = ['city', 'name'], keep = 'first'))]
id city name
0 1 bj NaN
1 2 bj jack
3 4 bj jim
4 5 sh NaN
6 7 sh steve
7 8 sh fionahttps://stackoverflow.com/questions/65352814
复制相似问题