我有一个像这样的pandas数据框:
rank_2015 num_2015 rank_2014 num_2014 .... num_2008
France 8 1200 9 1216 .... 1171
Italy 11 789 6 788 .... 654
现在我想按年份绘制一个仅num_
列的总和的条形图。所以在x轴上我想要从2008年到2015年,并且在y轴上我想要相关num_
列的总和。
最好的方法是什么?我知道如何获得每列的总和:
df.sum()
但我不知道的是如何只绘制num_
列的图表,以及如何重新标记这些列以使标签是整数而不是字符串,以便将它们带到图表正确。
我想知道是否要创建分层列,如下所示:
rank num
2015 2014 2015 2014 .... 2008
France 8 9 1200 1216 .... 1171
Italy 11 6 789 788 .... 654
然后我可以在num
部分中绘制列。
如何让我的数据框成为这种形状?
答案 0 :(得分:3)
您可以将str.extract
与正则表达式模式(.+)_(\d+)
一起使用来转换列
到DataFrame:
cols = df.columns.str.extract(r'(.+)_(\d+)', expand=True)
# 0 1
# 0 num 2008
# 1 num 2014
# 2 num 2015
# 3 rank 2014
# 4 rank 2015
然后,您可以cols
build a hierarchical (MultiIndex) index重新分配
到df.columns
:
df.columns = pd.MultiIndex.from_arrays((cols[0], cols[1]))
以便df
成为
num rank
2008 2014 2015 2014 2015
France 1171 1216 1200 9 8
Italy 654 788 789 6 11
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame({ 'num_2008': [1171, 654],
'num_2014': [1216, 788],
'num_2015': [1200, 789],
'rank_2014': [9, 6],
'rank_2015': [8, 11]}, index=['France', 'Italy'])
cols = df.columns.str.extract(r'(.+)_(\d+)', expand=True)
cols[1] = pd.to_numeric(cols[1])
df.columns = pd.MultiIndex.from_arrays((cols[0], cols[1]))
df.columns.names = [None]*2
df['num'].sum().plot(kind='bar')
plt.show()
答案 1 :(得分:1)