以这种形式给出数据框:
ID A
130 Yes
130-1 Yes
130-2 Yes
200 No
201 No
201-10 No
201-101 Yes
201-22 Yes
300 No
我想删除其他行中连字符(ID
)之前另一个字符串中-
列中具有值的行
因此,基于此,由于存在201
,201-10
等,我将丢弃值201-101
。
预期输出:
ID A
130-1 Yes
130-2 Yes
200 No
201-10 No
201-101 Yes
201-22 Yes
300 No
答案 0 :(得分:3)
使用duplicated
和一些按位操作。这确实取决于没有连字符的值,而之前是带有连字符的值。
s = df['ID'].str.split('-').str[0]
m = s.duplicated(keep=False) ^ s.duplicated()
df[~m]
ID A
1 130-1 Yes
2 130-2 Yes
3 200 No
5 201-10 No
6 201-101 Yes
7 201-22 Yes
8 300 No
答案 1 :(得分:1)
这是一种方法:
g = df.ID.str.split('-').str[0]
is_child = g.eq(g.shift())
is_unique = g.groupby(g).transform('size').eq(1)
output = df[is_child | is_unique]
print(output)
ID A
1 130-1 Yes
2 130-2 Yes
3 200 No
5 201-10 No
6 201-101 Yes
7 201-22 Yes
8 300 No
位置:
df.assign(first_num=g,
is_child=is_child,
is_unique=is_unique)
ID A first_num is_child is_unique
0 130 Yes 130 False False
1 130-1 Yes 130 True False
2 130-2 Yes 130 True False
3 200 No 200 False True
4 201 No 201 False False
5 201-10 No 201 True False
6 201-101 Yes 201 True False
7 201-22 Yes 201 True False
8 300 No 300 False True