使用pandas数据框迭代多列和行

2024-09-21 01:16:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我对Pandas相当陌生,急需帮助,通过比较多个组对中的连续行来修改我的数据帧:

数据帧示例=

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的行,需要删除该行的压力值小于其上方的行)。我不想比较不同的idStation&idCast对,即循环的第一次迭代将查看idStation=1、idCast=1的压力记录,循环的第二次迭代将查看idStation=1、idCast=2等的记录)。我尝试过按idStation和idCast进行分组,然后在它们上循环并逐行比较,但这只修改了一个副本,而不是原始的数据帧,并且更改会丢失。在

^{pr2}$

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

如何创建dataframe的副本(以便访问原始版本和修改版本),然后删除上面提到的行?在


Tags: 数据标记版本示例pandas记录副本压力
1条回答
网友
1楼 · 发布于 2024-09-21 01:16:20

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

  1. 使用.groupby()来处理['idStation', 'idCast']的唯一子集。在
  2. 对于这些组中的每一组,检查当前的'Pressure'值是否低于正在运行的maxcummax()),并返回逆值{}(即False,如果该值低于此值)。结果从groupby()返回为.values。在
  3. boolean indexing中使用2.的结果删除符合条件的行。在

pandas代码中,如下所示:

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

获得:

^{pr2}$

您还可以消除@MaxU建议的.apply()步骤,以使玩具数据的速度提高约40%:

df[df.Pressure >= df.groupby(['idStation','idCast'])['Pressure'].cummax()]

相关问题 更多 >

    热门问题