使用其他列的所有数据绘制列中出现次数最多的 (n) 个值

Plot the most (n) occurring values of a column with all of data of other column

我在来自 sql 查询的 Pandas DataFrame 中有以下数据:

      latin_brands   group phone_brand_chinese_match only_latin_brands
0           xiaomi  M32-38                        小米            xiaomi
1           xiaomi  M32-38                        小米            xiaomi
2           xiaomi  M32-38                        小米            xiaomi
3           xiaomi  M29-31                        小米            xiaomi
4           xiaomi  M29-31                        小米            xiaomi
5             None  F24-26                      OPPO              OPPO
6          coolpad  M32-38                        酷派           coolpad
7           xiaomi  M32-38                        小米            xiaomi
8             None  M32-38                      vivo              vivo
9          samsung  F33-42                        三星           samsung
10          huawei  M29-31                        华为            huawei
11          huawei  F33-42                        华为            huawei
12         samsung  F27-28                        三星           samsung
13          huawei  M32-38                        华为            huawei
14         aiyouni    M39+                       艾优尼           aiyouni
15          huawei  F27-28                        华为            huawei
16          xiaomi  M32-38                        小米            xiaomi
17          xiaomi  M32-38                        小米            xiaomi
18           meizu    M39+                        魅族             meizu
19          xiaomi  M32-38                        小米            xiaomi
20         samsung  F33-42                        三星           samsung
21          xiaomi  M23-26                        小米            xiaomi
22          huawei  M23-26                        华为            huawei
23         samsung  M27-28                        三星           samsung
24          xiaomi  M29-31                        小米            xiaomi
25         samsung  M32-38                        三星           samsung
26         samsung  M32-38                        三星           samsung
27         samsung  F33-42                        三星           samsung
28         samsung  M32-38                        三星           samsung
29         samsung  M32-38                        三星           samsung
...            ...     ...                       ...               ...
74809       huawei  M27-28                        华为            huawei
74810         None  M29-31                       TCL               TCL

我想映射两列并将其绘制在折线图上。 我的做法:

phones = phones.groupby(['only_latin_brands', 'group']).size()
phones = phones.unstack()
phones = phones.fillna(0)
phones.head()
phones.plot(kind='line')
plt.show()

我想绘制 grouponly_latin_brands 之间的关系。

我怎样才能只绘制出现次数最多的 20 only_latin_brands 列及其 group 列?

可以用groupby size然后nlargest的方法:

In [11]: df.groupby("only_latin_brands").size()
Out[11]:
only_latin_brands
OPPO        1
aiyouni     1
coolpad     1
huawei      5
meizu       1
samsung     9
vivo        1
xiaomi     11
dtype: int64

In [12]: df.groupby("only_latin_brands").size().nlargest(2)
Out[12]:
only_latin_brands
xiaomi     11
samsung     9
dtype: int64

然后使用 isin 过滤掉那些行:

In [13]: df[df["only_latin_brands"].isin(df.groupby("only_latin_brands").size().nlargest(2).index)]
Out[13]:
   latin_brands   group phone_brand_chinese_match only_latin_brands
0        xiaomi  M32-38                        小米            xiaomi
1        xiaomi  M32-38                        小米            xiaomi
2        xiaomi  M32-38                        小米            xiaomi
3        xiaomi  M29-31                        小米            xiaomi
4        xiaomi  M29-31                        小米            xiaomi
7        xiaomi  M32-38                        小米            xiaomi
9       samsung  F33-42                        三星           samsung
12      samsung  F27-28                        三星           samsung
16       xiaomi  M32-38                        小米            xiaomi
17       xiaomi  M32-38                        小米            xiaomi
19       xiaomi  M32-38                        小米            xiaomi
20      samsung  F33-42                        三星           samsung
21       xiaomi  M23-26                        小米            xiaomi
23      samsung  M27-28                        三星           samsung
24       xiaomi  M29-31                        小米            xiaomi
25      samsung  M32-38                        三星           samsung
26      samsung  M32-38                        三星           samsung
27      samsung  F33-42                        三星           samsung
28      samsung  M32-38                        三星           samsung
29      samsung  M32-38                        三星           samsung

现在可以开始剧情了...

使用@AndyHayden 开始:

df[df.only_latin_brands.isin(df.groupby('only_latin_brands').size().nlargest(3).index)]\
  .groupby(['group','only_latin_brands']).size().unstack().fillna(0)\
  .plot(kind='line')

编辑以显示所有组:

df[df.only_latin_brands.isin(df.groupby('only_latin_brands').size().nlargest(3).index)]\
  .groupby(['group','only_latin_brands']).size().unstack()\
  .reindex(df.group.unique()).fillna(0).plot(kind='line')