我在这里失去主意。
好的。我有一个更大的系列,但是这个子集的例子可以。
如您所见,水果的每个类别都有3种类型,而第4类则是每种类别顶部的三种类型的总和。您还将注意到,有2个唯一的代码,分别为20和30,其中30代表“总计”行,而20代表实际的水果类型。
我需要代码根据每个水果的最大两个值的总和(不包括代码30行),告诉我在1994年哪个水果产量最高。
示例:对于苹果,代码将选择两个最大值,但不包括代码30行(P.Lady和Mac),并将其相加。然后,它将对每种水果执行相同的操作。最后,它将给我这些总和的两个最大值。
CODE FRUIT TYPE PRD1994 BHT1994 BHT1995 BHT1996
30 apples apples 248487 263500 292200 287700
20 apples P.Lady 123456 130000 132000 131000
20 apples Mac 123789 132000 158400 155000
20 apples Fiji 1242 1500 1800 1700
30 pears pears 288618 310000 372000 362000
20 pears Bartlett 28586 30000 36000 34000
20 pears Brown 157478 160000 192000 189000
20 pears Green 102554 120000 144000 139000
30 oranges oranges 270145 272000 277000 168000
20 oranges Navel 121578 118000 120000 11000
20 oranges Large 15978 14000 15000 12000
20 oranges Small 132589 140000 142000 145000
30 pineapples pineapples 662943 697000 755200 802000
20 pineapples Tall 151564 175000 180000 210000
20 pineapples Short 21634 22000 25200 32000
20 pineapples Mini 489745 500000 550000 560000
30 grapes grapes 2029943 2095001 2412000 13114600
20 grapes Green 1012356 1100000 1300000 12111100
20 grapes Purple 1008586 986000 1100000 989500
20 grapes Sour 9001 9001 12000 14000
30 peaches peaches 704353 507856 903000 712000
20 peaches Large 45789 52000 55000 62000
20 peaches Small 658563 455856 848000 650000
20 peaches Coffee 1 0 0 0
我尝试了很多事情。这就是我希望看到的:
In: ***NO IDEA***
Out: grapes, peaches
以下是我尝试过但失败的一些事情。我四处移动代码,以期希望效果可以混合使用,但我什至无法达成共识。我得到的最接近的数据是根据PRD1994列显示了一系列包含每个FRUIT的两个最大值的数据。我认为,如果我能回到那里,也许['PRD1994']。sum()可能可以完成它。
def sort_the_fruit():
#return fdf[fdf.CODE == 20] \
#.groupby('FRUIT') \
#.nlargest(2,'PRD1994') \
#.agg({'PRD1994':'max'},ascending=False)
#.groupby('FRUIT','TYPE')
#return fdf.groupby('FRUIT').fdf[5:12].agg(['min', 'max'])
#return fdf.columns[5:12]
#return fdf.groupby(['FRUIT', 'TYPE'])
#return fdf.groupby(['FRUIT','TYPE']).agg({'PRD1994':'max'})
#return fdf.groupby([('CODE' != 30),'FRUIT'])['PRD1994'].sum()
#.groupby(['CODE','FRUIT'])['PRD1994'].sum()
sort_the_fruit()
我使用代码的第一个返回值来摆脱30年代的代码。然后,当我尝试使用.groupby()跟随它时,我得到两个响应之一:
pandas.core.groupby.DataFrameGroupBy object at 0x7fb888082be0
或
File "<ipython-input-46-266164a56eb1>", line 5
.groupby(['STNAME','CTYNAME'])
^
SyntaxError: invalid syntax
如果我没有注释第2行,它将给我所有的行减去30的行。然后,如果我取消注释第3行,则得到第一个响应,或者如果我取消注释第6行,则得到第二个响应。
Python建议使用.apply,但我不了解如何使用.apply,而且我几乎不了解.agg,以至于我不知道它是否存在。我尝试使用重复项,但它只关心第一个,最后一个或全部,我需要它关心2个。
由于数据量大,我一直在尝试避免迭代,因此我向Google询问了很多问题,并在此过程中学到了很多东西,但我仍然不知道该怎么做。我需要帮助,真是太糟糕了,我需要您稍微解释一下代码的每一部分,以便我可以继续。
感谢您的时间和耐心, 唐
答案 0 :(得分:3)
不确定这是否是您想要的。但是您可以使用nlargest()
和groupby
df[df.CODE != 30].groupby('FRUIT').PRD1994.nlargest(2) # same as .groupby.apply(lambda g: g.nlargest(2))
产生
FRUIT
apples 2 123789
1 123456
grapes 17 1012356
18 1008586
oranges 11 132589
9 121578
peaches 22 658563
21 45789
pears 6 157478
7 102554
pineapples 15 489745
13 151564
Name: PRD1994, dtype: int64
现在,如果要这些值对中的sum
,只需在.sum()
中使用groupby
。您会得到:
df[df.CODE != 30].groupby('FRUIT').PRD1994.apply(lambda g: g.nlargest(2).sum())
FRUIT
apples 247245
grapes 2020942
oranges 254167
peaches 704352
pears 260032
pineapples 641309
Name: PRD1994, dtype: int64
如果您想获得 this 系列的nlargest
,只需再次使用它即可:)
df[df.CODE != 30].groupby('FRUIT').PRD1994.apply(lambda g: g.nlargest(2).sum()).nlargest(2)
FRUIT
grapes 2020942
peaches 704352
Name: PRD1994, dtype: int64
当然,如果只希望将grapes
和peaches
作为输出,只需获取最后一个pd.Series
和索引的索引即可;)