gpt4 book ai didi

python - 迭代pandas数据框中的多列和行

转载 作者:太空宇宙 更新时间:2023-11-03 16:26:44 24 4
gpt4 key购买 nike

我对 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 进行分组,然后循环它们并逐行比较,但这只会修改副本,而不是原始数据帧,并且更改会丢失。

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(因为我不确定如何删除该行),但仅限于组 View 。

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

最佳答案

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

  1. 使用 .groupby() 处理 ['idStation', 'idCast'] 的唯一子集。
  2. 对于每个组,检查当前的'Pressure'值是否低于运行的max (cummax()),并且返回反 bool 值(即False,如果该值低于此值)。结果从 groupby() 返回为 .values
  3. bool 索引中使用2.的结果删除满足条件的行。

pandas 代码中,如下所示:

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

获取:

    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

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

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

关于python - 迭代pandas数据框中的多列和行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37925903/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com