Python 用其他列的所有数据绘制一列中出现最多的(n)个值
我在sql查询的数据框中有以下数据:Python 用其他列的所有数据绘制一列中出现最多的(n)个值,python,pandas,dataframe,matplotlib,pandas-groupby,Python,Pandas,Dataframe,Matplotlib,Pandas Groupby,我在sql查询的数据框中有以下数据: latin_brands group phone_brand_chinese_match only_latin_brands 0 xiaomi M32-38 小米 xiaomi 1 xiaomi M32-38 小米 xiaomi 2 xiaomi
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()
我想绘制组
和仅拉丁品牌
之间的关系
如何仅绘制最常见的20个
仅拉丁品牌
列及其组
s?您可以使用按大小分组,然后使用最大的方法:
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 start进行绘图…:
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')
编辑以显示所有组:
谢谢您的建议!但是如何显示x轴上的所有组?如何在这种情况下使用plt.xticks?请尝试在x轴上取消堆叠(0)而不是取消堆叠(),因为它不会显示所有唯一的拉丁品牌。如何显示所有集团和品牌的名称?非常感谢。在我的手机上。。。“我稍后再看。@harun请参见“编辑到解决方案”。我使用df.group.unique()添加了一个重新索引,以获取要打印的数据帧中的所有组。
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')