我正在尝试对熊猫的分组数据执行操作。对于每个组,我希望遍历行并将它们与组中的第一行进行比较。如果条件满足,那么我想打印出行的详细信息。我的数据如下:
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
我的组是Orig
,Dest
对。如果组中除第一行之外的一行的Per
比第一行大,并且VolPct
大于.1,我想输出分组对和路由。在本例中,输出将是:
我尝试的代码如下:
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”循环中忽略第一行。有什么想法吗?谢谢!在
你已经很接近了。在
首先,您错误地调用了^{} 。您应该只传递一个列名列表,而不是一个DataFrame对象。因此,您应该使用
otp.groupby(['Orig','Dest'])
,而不是otp.groupby(otp['Orig','Dest'])
。在一旦你在小组中循环,你会遇到更多的问题。groupby对象中的组实际上是元组。元组中的第一项是分组键,第二项是分组数据。例如,您的第一个组将是以下元组:
您需要更改设置
^{pr2}$X
的方式来反映这一点。例如,X = lane.first(['Per'])
应该变成X = lane[1].iloc[0].Per
。之后,在遍历行和访问一行中的多个列时,只会出现一些小错误。要将其全部打包,您的循环应该如下所示:注意,我使用^{} 遍历行,并且在访问数据帧中的多个列时使用双括号。在
实际上不需要告诉pandas忽略每个组中的第一行,因为它永远不会触发if语句,但是如果您确实想跳过它,可以使用
lane[1:].iterrows()
。在相关问题 更多 >
编程相关推荐