Pandas Split Column String和Plot唯一值

时间:2016-02-22 20:38:11

标签: python pandas plot bar-chart

我有一个如下所示的数据框Df

                        Country  Year  
0                Australia, USA  2015   
1            USA, Hong Kong, UK  1982   
2                           USA  2012   
3                           USA  1994   
4                   USA, France  2013   
5                         Japan  1988   
6                         Japan  1997   
7                           USA  2013   
8                        Mexico  2000   
9                       USA, UK  2005   
10                          USA  2012   
11                      USA, UK  2014   
12                          USA  1980   
13                          USA  1992   
14                          USA  1997   
15                          USA  2003   
16                          USA  2004   
17                          USA  2007    
18                 USA, Germany  2009   
19                        Japan  2006   
20                        Japan  1995  

如果我试试这个

,我想为Country列制作一个条形图
Df.Country.value_counts().plot(kind='bar')

我得到这个情节

enter image description here

这是不正确的,因为它不会分隔国家/地区。我的目标是获得一个条形图,绘制列中每个国家的计数,但为了实现这一点,首先我必须以某种方式分割每行中的字符串(如果需要),然后绘制数据。我知道我可以使用Df.Country.str.split(', ')来分割字符串,但如果我这样做,我就无法绘制数据。

任何人都知道如何解决这个问题?

3 个答案:

答案 0 :(得分:4)

您可以使用向量化的Series.str.split方法拆分Country s:

In [163]: df['Country'].str.split(r',\s+', expand=True)
Out[163]: 
            0          1     2
0   Australia        USA  None
1         USA  Hong Kong    UK
2         USA       None  None
3         USA       None  None
4         USA     France  None
...

如果您stack此DataFrame将所有值移动到一个列中,那么您可以应用value_counts并按以前的方式绘制:

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame(
{'Country': ['Australia, USA', 'USA, Hong Kong, UK', 'USA', 'USA', 'USA, France', 'Japan', 'Japan', 'USA', 'Mexico', 'USA, UK', 'USA', 'USA, UK', 'USA', 'USA', 'USA', 'USA', 'USA', 'USA', 'USA, Germany', 'Japan', 'Japan'],
 'Year': [2015, 1982, 2012, 1994, 2013, 1988, 1997, 2013, 2000, 2005, 2012, 2014, 1980, 1992, 1997, 2003, 2004, 2007, 2009, 2006, 1995]})
counts = df['Country'].str.split(r',\s+', expand=True).stack().value_counts()
counts.plot(kind='bar')
plt.show()

答案 1 :(得分:2)

from collections import Counter

c = pd.Series(Counter(df.Country.str.split(',').sum()))
>>> c.plot(kind='bar', title='Country Count')

enter image description here

答案 2 :(得分:1)

new_df = pd.concat([Series(row['Year'], row['Country'].split(',')) for _, row in DF.iterrows()]).reset_index()

(DF是你的旧DF)。   这将为每个国家/地区名称提供一个数据点。

希望这有帮助。

干杯!