我正在尝试对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”循环中忽略第一行。有任何想法吗?谢谢!
答案 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)
。