如何在Panda中分组多列

时间:2018-03-23 06:45:01

标签: python python-2.7 data-science pandas-groupby

考虑下面的Panda DataFrame

Fruit   Rate    Quantity
-------------------------
Apple   2       4
Apple   3       3
Apple   5       9
Mango   4       5
Mango   6       12
Banana  2       2
banana  1       2

这里是水果的总量。

芒果:5 + 12 = 17

Apple:4 + 3 + 9 = 16

香蕉:2 + 2 = 4

我想要的是一个新的数据框,按每个Fruit的总数量(不论速率)排序(降序),然后按每个Fruit的速率排序。

为了更好地理解,请参阅下面的所需输出

Fruit   Rate    Quantity
---------------------------
Mango   6       12
Mango   4       5
Apple   5       9
Apple   3       3
Apple   2       4
Banana  2       2
Banana  1       2

说明:由于芒果的数量最多,即17(然后苹果有16,然后香蕉有4),所有芒果行都放在上面,然后是Apple anfd,然后是香蕉。还有2行芒果,速率为4和6.因此,速率6的芒果将比输出中的速率4的芒果高。

有人可以向我提供熊猫代码吗?

非常感谢

顺便说一下,我可以通过sql

来做到这一点
select fr_table.*
from fr_table,
( select fruit, sum(quantity) sm
  from fr_table
  group by fruit
 ) temp
 where 
 fr_table.fruit=temp.fruit
 order by temp.sm desc, fr_table.rate desc;

2 个答案:

答案 0 :(得分:0)

这是一种方式。添加Total列,按RateTotal排序,然后删除.sort

注意.sort_values现已弃用.sort,但由于您使用的是Python 2.7,因此您的Pandas版本可能会接受df['Total'] = df.groupby('Fruit')['Quantity'].transform('sum') df = df.sort(columns=['Total', 'Rate'], ascending=False, axis=0)\ .drop('Total', 1)

    Fruit  Rate  Quantity
4   Mango     6        12
3   Mango     4         5
2   Apple     5         9
1   Apple     3         3
0   Apple     2         4
5  Banana     2         2
6  Banana     1         2

结果:

Cordova CLI

答案 1 :(得分:0)

你是一个SQL人,不要打它,使用SQL来通过'pandasql'来转动Pandas数据框

import pandas as pd
import pandasql as ps

df = pd.DataFrame([['Apple',2,4],
['Apple',3,3],
['Apple',5,9],
['Mango',4,5],
['Mango',6,12],
['Banana',2,2],
['banana',1,2]], columns=
['Fruit',   'Rate',   'Quantity'])

q1 = """
select df.*
from df,
( select fruit, sum(quantity) sm
  from df
  group by fruit
 ) temp
 where 
 df.fruit=temp.fruit
 order by temp.sm desc, df.rate desc;"""

newdf = ps.sqldf(q1, locals())

print(newdf)

结果:

    Fruit  Rate  Quantity
0   Mango     6        12
1   Mango     4         5
2   Apple     5         9
3   Apple     3         3
4   Apple     2         4
5  Banana     2         2
6  banana     1         2

修改

从代码的时间,JPP,只有大熊猫,回答更有效率,考虑到开销,这并不奇怪。

import timeit
from sklearn.utils import resample

df5mil = resample(df , n_samples=5000, random_state=0)
q2 = """
select df5mil.*
from df5mil,
( select fruit, sum(quantity) sm
  from df5mil
  group by fruit
 ) temp
 where 
 df5mil.fruit=temp.fruit
 order by temp.sm desc, df5mil.rate desc;"""

def performance_test(df):
    df['Total'] = df.groupby('Fruit')['Quantity'].transform('sum')
    return df.sort_values(by=['Total', 'Rate'], ascending=False, axis=0)\
        .drop('Total', 1)

计时结果:

timeit.timeit('newdf5mil = ps.sqldf(q2, locals())', number=10, setup = 'from __main__ import df5mil',globals=globals())
Out[21]: 1.3951236820267923

timeit.timeit('newdf5mil = performance_test(df5mil)', number=10, setup = 'from __main__ import df5mil',globals=globals())
Out[22]: 0.12005714190763683

...但你不能使用SQL。