3

给定这种形式的数据框:

 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-10201-101等等。

预期输出:

 ID      A
130-1   Yes
130-2   Yes
200     No
201-10  No
201-101 Yes
201-22  Yes
300     No
4

2 回答 2

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
于 2019-11-12T15:04:31.253 回答
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
于 2019-11-12T14:59:42.267 回答