假设我有一个数据帧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
[...]
如何在输出中保持主要的国家/地区升序,然后按模式出现次数降序排序?
答案 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