遍历分组数据Python/Pandas

2024-06-03 13:32:34 发布

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

我正在尝试对熊猫的分组数据执行操作。对于每个组,我希望遍历行并将它们与组中的第一行进行比较。如果条件满足,那么我想打印出行的详细信息。我的数据如下:

Orig  Dest  Route  Vol    Per   VolPct
ORD   ICN   A      2,251  0.64  0.78
ORD   ICN   B      366    0.97  0.13
ORD   ICN   C      142    0.14  0.05
DCA   FRA   A      9,059  0.71  0.85
DCA   FRA   B      1,348  0.92  0.13
DCA   FRA   C      281    0.8   0.03

我的组是OrigDest对。如果组中除第一行之外的一行的Per比第一行大,并且VolPct大于.1,我想输出分组对和路由。在本例中,输出将是:

^{pr2}$

我尝试的代码如下:

for lane in otp.groupby(otp['Orig','Dest']):
    X = lane.first(['Per'])
    for row in lane:
        if (row['Per'] > X and row['VolPct'] > .1):
            print(row['Orig','Dest','Route'])

但是,这不起作用,所以我显然没有做正确的事情。我也不知道如何告诉Python在“row-in-lane”循环中忽略第一行。有什么想法吗?谢谢!在


Tags: 数据inforroutedestrowotporig
1条回答
网友
1楼 · 发布于 2024-06-03 13:32:34

你已经很接近了。在

首先,您错误地调用了^{}。您应该只传递一个列名列表,而不是一个DataFrame对象。因此,您应该使用otp.groupby(['Orig','Dest']),而不是otp.groupby(otp['Orig','Dest'])。在

一旦你在小组中循环,你会遇到更多的问题。groupby对象中的组实际上是元组。元组中的第一项是分组键,第二项是分组数据。例如,您的第一个组将是以下元组:

(('DCA', 'FRA'),   Orig Dest Route    Vol   Per  VolPct
 3  DCA  FRA     A  9,059  0.71    0.85
 4  DCA  FRA     B  1,348  0.92    0.13
 5  DCA  FRA     C    281  0.80    0.03)

您需要更改设置X的方式来反映这一点。例如,X = lane.first(['Per'])应该变成X = lane[1].iloc[0].Per。之后,在遍历行和访问一行中的多个列时,只会出现一些小错误。要将其全部打包,您的循环应该如下所示:

^{pr2}$

注意,我使用^{}遍历行,并且在访问数据帧中的多个列时使用双括号。在

实际上不需要告诉pandas忽略每个组中的第一行,因为它永远不会触发if语句,但是如果您确实想跳过它,可以使用lane[1:].iterrows()。在

相关问题 更多 >