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

Pandas Split Column String and Plot unique values

我有一个数据框 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(', ') 来拆分字符串,但如果我这样做,我就无法绘制数据。

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

from collections import Counter

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

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

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

希望对您有所帮助。

干杯!

您可以使用矢量化 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
...

如果您 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()