Pandas拆分列字符串和图唯一值

Isa*_*ley 1 python plot bar-chart pandas

我有一个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  
Run Code Online (Sandbox Code Playgroud)

我想为该Country列制作条形图,如果我尝试这样做

Df.Country.value_counts().plot(kind='bar')
Run Code Online (Sandbox Code Playgroud)

我得到这个情节

在此处输入图片说明

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

有人知道如何解决这个问题吗?

unu*_*tbu 5

您可以使用向量化Series.str.split方法来拆分Countrys:

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
...
Run Code Online (Sandbox Code Playgroud)

如果堆叠此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()
Run Code Online (Sandbox Code Playgroud)