我正在使用的数据集在这里。这是Chipotle订单的数据集。item_name
对于每种出售的商品都有一个,然后在item_name
其中有多个可能choice_description
准确描述商品的内容。
因此,让我们先导入文件并对其进行一些清理:
chipo = pd.read_csv('chipotle.tsv', sep='\t')
del chipo['order_id']
del chipo['quantity']
chipo['revenue'] = chipo['item_price'].str.replace('$','').astype(float)
chipo['count'] = 1
我试图列出choice_description
每个团队订购的数量item_name
。通过使用groupby然后将各列(包括1的列)求和,这很容易,
grouped = chipo.groupby(['item_name','choice_description']).sum()
但现在我想对其中的计数'item_name'
进行排序。哦,我也想保留该item_price
列以便以后进行计算,所以我不能仅将DataFrame转换为单列框架。对于我的一生,我不知道该怎么做。
我不能只打电话,grouped.sort_values('count')
因为它对所有观察结果进行排序,而不仅仅是对各个item_name
组进行排序。如何仅按该列排序,但将排序限制在组内?
即使似乎以前的答案都在讨论这个问题(例如here),但是它们全部都使用了已弃用的排序命令(例如Series.order()
或DataFrame.sort()
),或者没有完全满足我的需要。我该如何执行看似简单的任务?
如何仅按该列排序,但将排序限制在组内?
按item_name
和排序count
。因为item_name
是索引级别,并且count
是列,所以我们必须移至item_name
列并进行调用,DataFrame.sort_values
或者移至count
索引并进行调用DataFrame.sortlevel
。
例如
import pandas as pd
chipo = pd.read_csv('chipotle.tsv', sep='\t')
del chipo['order_id']
del chipo['quantity']
chipo['revenue'] = chipo['item_price'].str.replace('$','').astype(float)
chipo['count'] = 1
result = chipo.groupby(['item_name','choice_description']).sum()
result = (result.set_index('count', append=True)
.sortlevel(axis=0, level=['item_name', 'count'], ascending=False)
.reset_index('count', drop=False))
产量
revenue \
revenue count
item_name choice_description
Veggie Salad Bowl [Fresh Tomato Salsa, [Fajita Vegetables, Lettuc... 11.25 1
[Fresh Tomato Salsa, [Fajita Vegetables, Rice, ... 11.25 1
[Fresh Tomato Salsa, [Fajita Vegetables, Rice, ... 11.25 1
[Fresh Tomato Salsa, [Rice, Lettuce, Guacamole,... 11.25 1
...
Barbacoa Bowl [Roasted Chili Corn Salsa, [Fajita Vegetables, ... 23.50 2
[Fresh Tomato Salsa, [Fajita Vegetables, Rice, ... 9.25 1
[Fresh Tomato Salsa, [Fajita Vegetables, Rice, ... 9.25 1
[Tomatillo Red Chili Salsa, [Fajita Vegetables,... 11.75 1
[Tomatillo Red Chili Salsa, [Rice, Black Beans,... 9.25 1
[Tomatillo Red Chili Salsa, [Rice, Cheese, Lett... 9.25 1
[Tomatillo Red Chili Salsa, [Rice, Pinto Beans,... 9.25 1
[[Tomatillo-Green Chili Salsa (Medium), Roasted... 11.48 1
[[Tomatillo-Red Chili Salsa (Hot), Tomatillo-Gr... 8.99 1
6 Pack Soft Drink [Diet Coke] 19.47 3
[Coke] 6.49 1
[Sprite] 6.49 1
[314 rows x 2 columns]
在上述两个选项中,使用sortlevel
的速度比快sort_values
。这是一个基准:
In [73]: %timeit using_sortlevel(totals)
10 loops, best of 3: 148 ms per loop
In [74]: %timeit using_sort_values(totals)
10 loops, best of 3: 174 ms per loop
使用此设置:
import pandas as pd
N = 10**6
chipo = pd.DataFrame(np.random.randint(1000, size=(N,4)), columns=list('ABCD'))
totals = chipo.groupby(['A','B']).sum()
def using_sortlevel(df):
return (df.set_index('C', append=True)
.sortlevel(axis=0, level=['A', 'C'], ascending=False)
.reset_index('C', drop=False))
def using_sort_values(df):
return (df.reset_index('A')
.sort_values(by=['A', 'C'], ascending=False)
.set_index('A', append=True)
.swaplevel(0, 1, axis=0))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句