熊猫:如何对重复行的列中的值求和

时间:2018-08-19 03:41:26

标签: python pandas duplicates

我在这里失去主意。

好的。我有一个更大的系列,但是这个子集的例子可以。

如您所见,水果的每个类别都有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询问了很多问题,并在此过程中学到了很多东西,但我仍然不知道该怎么做。我需要帮助,真是太糟糕了,我需要您稍微解释一下代码的每一部分,以便我可以继续。

感谢您的时间和耐心, 唐

1 个答案:

答案 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

当然,如果只希望将grapespeaches作为输出,只需获取最后一个pd.Series和索引的索引即可;)