我有一个如下所示的数据框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(', ')
来分割字符串,但如果我这样做,我就无法绘制数据。
任何人都知道如何解决这个问题?
答案 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')
答案 2 :(得分:1)
new_df = pd.concat([Series(row['Year'], row['Country'].split(',')) for _, row in DF.iterrows()]).reset_index()
(DF是你的旧DF)。 这将为每个国家/地区名称提供一个数据点。
希望这有帮助。
干杯!