迭代pandas数据帧中的多个列和行

时间:2016-06-20 15:08:42

标签: python pandas

我对Pandas相当新,并且通过比较多个组配对中的连续行,迫切需要帮助来修改我的数据帧:

Dataframe example =

idData idStation idCast Pressure

1   1   1   1505
2   1   1   1506
3   1   1   1507
4   1   1   1508
5   1   2   1505
6   1   2   1506
7   1   2   1503
8   1   2   1504
9   2   1   1505
10  2   1   1506
11  2   1   1507

对于每个idStation和idCast对(即需要删除idData = 7和8的行),我想删除该行的Pressure值小于其上面的行的任何行。我不想比较不同的idStation和amp; idCast对 - 即循环的第一次迭代将查看idStation = 1的压力记录,idCast = 1,循环的第二次迭代将查看idStation = 1,idCast = 2等的记录。我已尝试通过idStation和idCast进行分组,然后循环遍历它们并逐行进行比较,但这只会修改副本,而不是原始数据框,并且更改会丢失。

Stn_Cast_Group = Dataframe.groupby(['idStation','idCast'])
for name, group in Stn_Cast_Group:
        j = 0
        for i in range(1,len(group['Pressure'])):                     
            if group['Pressure'].iloc[i] < j:
                group['Pressure'].iloc[i] = np.nan
            else:
                j = group['Pressure'].iloc[i]

这会将正确的压力值标记为nan(因为我不确定如何删除该行),但仅限于组视图。

如何创建数据框的副本(以便访问原始版本和修改版本),然后删除上述行?

1 个答案:

答案 0 :(得分:1)

您可以使用boolean indexing,条件是对于每个组,Pressure值不低于该组的.cummax()

  1. 使用.groupby()处理['idStation', 'idCast']的唯一子集。
  2. 对于其中每个组,请检查当前'Pressure'值是否低于正在运行的maxcummax()),并返回反boolean(即{{1}如果这个值在下面)。结果从False返回groupby()
  3. 使用.values2.的结果删除符合条件的行。
  4. boolean indexing代码中,这看起来像:

    pandas

    得到:

    df[~df.groupby(['idStation', 'idCast']).apply(lambda x: x.Pressure < x.Pressure.cummax()).values]
    

    您还可以消除@MaxU建议的 idData idStation idCast Pressure 0 1 1 1 1505 1 2 1 1 1506 2 3 1 1 1507 3 4 1 1 1508 4 5 1 2 1505 5 6 1 2 1506 8 9 2 1 1505 9 10 2 1 1506 10 11 2 1 1507 步骤,以便为玩具数据提高约40%的速度:

    .apply()