簡體   English   中英

熊貓 - 分組然后排序

[英]Pandas - Group and then sort

我想對DataFrame進行分組和排序,以便:

  • 我們首先按總數計算最大的區域()
  • 然后,我們按count()排序每個名稱

我有點設法在多行中做到這一點,但必須有更多的pythonic / pandas方式。

這樣做的目的不僅是顯示表格,而且還能夠將其傳遞給plot.ly等工具,以便首先使用具有更多計數的區域進行堆疊條形圖,然后將每個名稱從最大堆疊到最小堆疊。

所以這:

A   B   C
Region1 Name1   1
Region1 Name1   1
Region1 Name2   1
Region2 Name3   1
Region2 Name4   1
Region2 Name4   1
Region2 Name4   1
Region3 Name5   1
Region3 Name6   1

會成為:

A   B   Count C
Region2 Name4   3
        Name3   1
Region1 Name1   2
        Name2   1
Region3 Name5   1
        Name6   1

(抱歉,格式不太好,但這應該是正確的版本,因此您可以復制/粘貼表格數據)

用於創建第一個表的代碼:

df = pd.DataFrame({'A': {0: 'Region1',
  1: 'Region1',
  2: 'Region1',
  3: 'Region2',
  4: 'Region2',
  5: 'Region2',
  6: 'Region2',
  7: 'Region3',
  8: 'Region3'},
 'B': {0: 'Name1',
  1: 'Name1',
  2: 'Name2',
  3: 'Name3',
  4: 'Name4',
  5: 'Name4',
  6: 'Name4',
  7: 'Name5',
  8: 'Name6'},
 'C': {0: 1, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1}})

嗯,不確定這是不是最好的方法,但我使用的是sort_valuespd.Categorical

m=(df.groupby(['A','B'])['C'].size().reset_index().sort_values('C',ascending=False)
.reset_index(drop=True))
m.A = pd.Categorical(m.A,m.A.unique(),ordered=True)
m.sort_values('A').reset_index(drop=True)

         A      B  C
0  Region2  Name4  3
1  Region2  Name3  1
2  Region1  Name1  2
3  Region1  Name2  1
4  Region3  Name5  1
5  Region3  Name6  1

排序似乎發生在按地區組的最大計數,然后按地區 - 名稱組計數。

要獲得所需的結果,您需要計算最大/區域組,然后在顯示之前隱藏此列,您可以這樣做

df2 = df.groupby(['A', 'B']).agg('count')
df2['maxA'] = df2.groupby('A').C.transform('max')
df2.sort_values(['maxA', 'C'], ascending=[False, False])[['C']]

# produces the following output:

               C
A       B
Region2 Name4  3
        Name3  1
Region1 Name1  2
        Name2  1
Region3 Name5  1
        Name6  1

我會做兩個步驟:
步驟1:按計數創建排序A的掩碼索引
步驟2:使用.locsort=False重新排序dfgroupby並調用value_counts

m = df.groupby('A').A.transform('count').sort_values(ascending=False).index
df.loc[m].groupby('A', sort=False).B.value_counts().to_frame('Count')

Out[200]:
               Count
A       B
Region2 Name4      3
        Name3      1
Region1 Name1      2
        Name2      1
Region3 Name5      1
        Name6      1

其他方式:

region_totals = df.groupby('A')['C'].sum()
mapping  = dict(zip(region_totals.index, region_totals.values))
df['D'] = df["A"].map(mapping)

df2 = df.groupby(['D','A','B']).sum().sort_values(['D','C'], ascending =False)
df2.index = df2.index.droplevel(0)

df2.rename(columns={'C':'Count'}

                Count
A       B   
Region2 Name4   3
        Name3   1
Region1 Name1   2
        Name2   1
Region3 Name5   1
        Name6   1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM