考虑下面的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;
答案 0 :(得分:0)
这是一种方式。添加Total
列,按Rate
和Total
排序,然后删除.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。