使用pandas删除列的基于行的值

时间:2016-03-16 23:42:55

标签: python mysql pandas

我是大熊猫的新手,需要一些帮助才能删除符合我原始表格中某些条件的行。

表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代码以删除满足这些条件的行?

谢谢

2 个答案:

答案 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)]