どのように私はちょうど並べ替え、その列ではなく、グループ内に拘束ソートを保つことができますか?
両方で並べ替えます。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))
について
はsortlevel
がsort_values
より少し速い用いて、上記の二つのオプションの
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]
をもたらします。
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))
興味深い はここでベンチマークです。私はこれを行うためのより「組み込みの」方法があると考えていたでしょう(これはやりにくいことではありません)。ありがとう。 – gogurt