循环分组数据 - Python / Pandas

时间:2018-01-04 18:20:23

标签: python pandas pandas-groupby

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

$('.summernote').on('summernote.init', function () {
      $('.summernote').summernote('codeview.activate');
    }).summernote({
      height: 300,
      placeholder: 'Paste content here...',
      codemirror: { 
        theme: 'monokai'
      }
    });

我的群组为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大于.1,我想输出分组对和路径。在此示例中,输出将为:

VolPct

我尝试的代码如下:

ORD ICN B
DCA FRA B

然而,这不起作用,所以我显然没有做对。我也不确定如何告诉Python在“row in lane”循环中忽略第一行。有任何想法吗?谢谢!

1 个答案:

答案 0 :(得分:2)

你很亲密。

首先,您错误地呼叫groupby。您应该只传递列名列表而不是DataFrame对象。因此,您应该使用otp.groupby(['Orig','Dest'])而不是(('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)

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

X

您需要更改设置X = lane.first(['Per'])的方式以反映这一点。例如,X = lane[1].iloc[0].Per应该变为for key, lane in otp.groupby(otp['Orig','Dest']): X = lane.iloc[0].Per for idx, row in lane.iterrows(): if (row['Per'] > X and row['VolPct'] > .1): print(row[['Orig','Dest','Route']]) 。之后,您只能在遍历行并访问行中的多个列的方式中出现轻微错误。要将它包装起来,你的循环应该是这样的:

lane[1:].iterrows()

请注意,我使用iterrows来遍历行,并且在访问DataFrame中的多个列时使用双括号。

你真的不需要告诉pandas忽略每个组中的第一行,因为它永远不应该触发你的if语句,但如果你确实想要跳过它,你可以使用portfolio = serializers.MyRelatedField(many=True)