使用其他列的所有数据绘制列的大多数(n)出现值

时间:2017-11-14 22:18:41

标签: python pandas dataframe matplotlib pandas-groupby

我在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之间的关系。

如何仅使用only_latin_brands s绘制最常出现的20 group列?

2 个答案:

答案 0 :(得分:1)

您可以使用groupby大小,然后使用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

现在你可以做这个情节......

答案 1 :(得分:0)

使用@AndyHayden开始:

.test li {
    padding-bottom: 20px;
    padding-left: 0;
    padding-right: 0;
}

enter image description here

编辑以显示所有组:

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')

enter image description here