我是大熊猫的新手,需要一些帮助才能删除符合我原始表格中某些条件的行。
表1(原始表):
ID SerialNo calls
1 171723 Blue 2
2 171723 Green 3
3 171723 Blue 4
4 171723 Yellow 5
5 171723 Blue 1
6 171724 Green 1
7 171724 Yellow 2
8 171724 Green 3
9 171724 Green 4
10 171724 Green 5
11 171724 Yellow 6
Table1_mod(已过滤的表格):
ID SerialNo calls
1 171723 Blue 2
2 171723 Green 3
3 171723 Blue 4
4 171723 Yellow 5
5 171724 Green 1
6 171724 Yellow 2
7 171724 Green 3
8 171724 Green 4
9 171724 Green 5
10 171724 Yellow 6
我想根据以下内容获取修改后的表格:
ID列包含唯一编号。例如,对于具有' 171723'的所有行,以及列' SerialNO'我对Blue'感兴趣。所以我想要最后一排' 171723'删除,因为蓝色(SerialNo列)有一行对应于' 1' (调用列)小于' 2' (' 171723')
中第一次出现蓝色呼叫列如何编写pandas代码以删除满足这些条件的行?
谢谢
答案 0 :(得分:1)
只是为了澄清:你想要查看id号组,在序列号列中找到第一个出现的'Blue',并删除该组中序列号也是蓝色和调用值的任何其他行小于第一个'蓝色'行中的调用值?
我会先按ID
对您的数据框进行分组id_groups = Table1.groupby('ID')
然后定义一个函数进行过滤:
def blue_filter(group):
blues = group[group['SerialNo'] == 'Blue']
try:
first_blue_call = blues['calls'].iloc[0]
except:
return group
return group[(group['SerialNo'] != 'Blue') | (group['calls'] >= first_blue_call)]
现在将该功能应用于您的组并将组重组为新的数据帧并重置索引
Table1_mod = id_groups.apply(blue_filter)
Table1_mod.index = Table1_mod.index.levels[1]
答案 1 :(得分:1)
我认为你可以一次性使用apply和一个单独的dict来跟踪你的最大通话值。这也涉及这样一个事实:我认为你要抛出任何一个电话号码低于该ID的前一行SerialNo组合的行。
max_dict = {}
def keep_row(row):
if row.calls > max_dict.get((row.ID, row.SerialNo), 0):
max_dict[(row.ID, row.SerialNo)] = row.calls
return True
else:
return False
Table1_mod = Table1[Table1.apply(keep_row, axis=1)]