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 方法拆分 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()
我有一个数据框 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 方法拆分 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()