Skip to main content
 首页 » 编程设计

python之Pandas 拆分列字符串并绘制唯一值

2025年05月04日14Free-Thinker

我有一个如下所示的数据框 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') 

我明白了这个情节

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

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

请您参考如下方法:

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

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