python - Python:删除多个条件的空值和重复项
问题描述
我是 python 新手,经过大量研究和测试,我仍然无法解决这个问题。
我试图在某些条件下删除空值和重复项,基本上我应该留下唯一的“ID”。我可以使用 .duplicated 然后 .drop_duplicates 和 .dropna 来删除我的数据帧子集的相关行,但我无法弄清楚如何在不删除我想要保留的行的情况下将它们全部放在原始数据帧上。
我还想将所有删除的记录保存在一个单独的数据框中,但还没有想到这怎么可能。
条件;
- 当“ID”重复且“类型”唯一时删除所有重复项(keep=False)
- 仅在“ID”和“类型”重复时删除空“代码”值
- 当 'ID' 和 'type' 重复且 'code' 唯一时删除重复项(keep='first')
数据框;
df = pd.DataFrame(columns=['ID','code','type'])
df.ID = [1,1,2,2,3,3,4,5,6,6,7,7]
df.code = ['a',np.nan,'b','c','d','d','a',np.nan,'e','f','g',np.nan]
df.type = ['type1','type1','type2','type2','type1','type2','type3','type1','type1','type2','type1','type2']
ID code type
0 1 a type1
1 1 NaN type1
2 2 b type2
3 2 c type2
4 3 d type1
5 3 d type2
6 4 a type3
7 5 NaN type1
8 6 e type1
9 6 f type2
10 7 g type1
11 7 NaN type2
生成的数据框应如下所示;
ID code type
0 1 a type1
1 2 b type2
2 4 a type3
3 5 NaN type1
目前,这是我为获得正确结果所做的事情,但我觉得有更好的方法。
df_unique = df.drop_duplicates(subset=['ID'],keep=False)
df_dupe = df[df.duplicated(['ID','type'],keep=False)]
df_dupe2 = df_dupe.dropna(subset=['code']).drop_duplicates(subset=['ID','type'])
df_final = pd.concat([df_unique,df_dupe2]).sort_values('ID')
任何建议将不胜感激。
解决方案
&
您可以使用for bitwise AND
、|
for bitwiseOR
和~
for inverse链接掩码:
m1 = df.duplicated(subset=['ID'],keep=False)
m2 = df.duplicated(['ID','type'],keep=False)
m3 = df.duplicated(['ID','type'])
m4 = df['code'].notna()
df = df[~m1 | (m2 & ~m3 & m4)].sort_values('ID')
print (df)
ID code type
0 1 a type1
2 2 b type2
6 4 a type3
7 5 NaN type1
推荐阅读
- xcode - 如何将现有的 sqlite 数据库连接到我的 Visual Studio (Cocoa) 项目和 macOS 上的 Xcode?
- domain-driven-design - 包含过多信息的实体的 DDD
- docker - 如何在 docker 文件中下载大型数据集?
- javascript - js正则表达式在匹配后获取字符
- macos - 在 MacOS 的通知中标记为已读选项
- excel - 私人子工作表_更改多个范围
- junit5 - 如何将 JUnit 4 参数化测试迁移到 JUnit 5 ParameterizedTest?
- c++ - 为 unsigned char* 分配一个数字
- java - 对 Java Servlet 的 Angular 请求被阻止的 CORS 策略
- r - 如何有效地对R中的字符串中的字符进行排序?