我对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(因为我不确定如何删除该行),但仅限于组视图。
如何创建数据框的副本(以便访问原始版本和修改版本),然后删除上述行?
答案 0 :(得分:1)
您可以使用boolean indexing
,条件是对于每个组,Pressure
值不低于该组的.cummax()
。
.groupby()
处理['idStation', 'idCast']
的唯一子集。 'Pressure'
值是否低于正在运行的max
(cummax()
),并返回反boolean
(即{{1}如果这个值在下面)。结果从False
返回groupby()
。.values
中2.
的结果删除符合条件的行。在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()