我有一个这样的数据框,
col1 col2
A 1
B 2
C 3
D 3
E 3
F 4
G 5
H 5
I 5
J 5
现在,我想删除连续的col2值大于3倍的那些行,在上面的数据框中,5的col2值出现了3次以上,因此应删除这些行。所以最终的数据帧应该看起来像
col1 col2
A 1
B 2
C 3
D 3
E 3
F 4
我可以使用带有计数器签入的for循环来执行此操作,但是执行时间会更长。寻找一些有效的pythonic方式/熊猫捷径。
答案 0 :(得分:1)
将Series.value_counts
与Series.map
一起用于计数值,然后在Series.le
中用boolean indexing
进行小于或等于的过滤:
df = df[df['col2'].map(df['col2'].value_counts()).le(3)]
print (df)
col1 col2
0 A 1
1 B 2
2 C 3
3 D 3
4 E 3
5 F 4
对于测试连续值,将辅助器Series
与Series.shift
和Series.cumsum
一起使用,并传递到GroupBy.transform
(并在其后指定列):
g = df['col2'].ne(df['col2'].shift()).cumsum()
df = df[df.groupby([g,'col2'])['col2'].transform('size').le(3)]
print (df)
col1 col2
0 A 1
1 B 2
2 C 3
3 D 3
4 E 3
5 F 4
答案 1 :(得分:1)
要标识连续值,通常需要cumsum
上的差异和分组依据:
groups = df.col2.ne(df.col2.shift()).cumsum()
group_sizes = df.groupby(groups).transform('size')
out = df[group_sizes <= 3)