在分组中维护Pandas Dataframe主排序顺序

时间:2017-04-13 19:32:06

标签: python pandas dataframe

假设我有一个数据帧seqdf

Country     Pattern
Hong Kong   abc 
Hong Kong   def
[...]
Australia   ghi
Australia   jkl
[...]

我希望按国家/地区获得最常见的模式。

我这样做:

        seqdf.groupby('Country'['Pattern'].value_counts().sort_values(ascending=False)[:100]

但是这具有在不保持Country分组的情况下对模式的出现进行排序的效果。输出可能如下所示:

Hong Kong  def    5101
Australia  jki    4888
Hong Kong  abc    3123  
Australia  efg    1882
[...]

如何在输出中保持主要的国家/地区升序,然后按模式出现次数降序排序?

2 个答案:

答案 0 :(得分:2)

您可以尝试这样的事情:

seqdf.groupby('Country')['Pattern'].value_counts().to_frame('quantity').reset_index().sort_values(['Country', 'quantity'], ascending=[True, False])[:100]

要限制为每个国家/地区10种模式并获得纯数据框:

seqdf.groupby('Country')['Pattern'].value_counts().groupby(level=0).head(10).to_frame('quantity').reset_index()

或者像这样:

seqdf.groupby(['Country', 'Pattern']).agg({'Pattern':'count'}).rename(columns={'Pattern':'quantity'}).groupby(level=0).head(10).reset_index().sort_values(['Country', 'quantity'], ascending=[True, False])

答案 1 :(得分:2)

value_counts默认情况下按降序对结果进行排序,因此groupby.value_counts应该这样做;如果您需要查看每个国家/地区的前n行,则可以使用groupby.head从每个国家/地区获取前n行:

实施例

from io import StringIO
df = pd.read_csv(StringIO("""Country     Pattern
Hong Kong   def
Hong Kong   abc
Hong Kong   def
Hong Kong   ghi
Australia   ghi
Australia   jkl
Australia   jkl
Australia   abc
Australia   jkl"""), sep = "\s{2,}")

groupby国家/地区并按系列中的value_counts结果排序,按每个组内的降序排序:

df.groupby("Country")['Pattern'].value_counts()

#Country    Pattern
#Australia  jkl        3
#           abc        1
#           ghi        1
#Hong Kong  def        2
#           abc        1
#           ghi        1
#Name: Pattern, dtype: int64

要查看每个国家/地区的前5项(0级索引),请使用groupby.head,这将为每个国家/地区占用前n行:

df.groupby("Country")['Pattern'].value_counts().groupby(level=0).head(2)

#Country    Pattern
#Australia  jkl        3
#           abc        1
#Hong Kong  def        2
#           abc        1
#Name: Pattern, dtype: int64