如何在熊猫中创建分层列?

时间:2016-10-09 15:12:50

标签: python pandas

我有一个像这样的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部分中绘制列。

如何让我的数据框成为这种形状?

2 个答案:

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

enter image description here

答案 1 :(得分:1)

可能您不需要重新塑造数据集,可以更容易实现。

  1. 创建新数据集,其中仅包含num_个数据
  2. 重命名列
  3. 情节总和
  4. 虚拟数据:

    enter image description here

    代码:

    df_num = df[[c for c in df.columns if c.startswith('num_')]]
    df_num.columns = [c.lstrip('num_') for c in df_num.columns]
    df_num.sum().plot(kind='bar')
    

    结果:

    enter image description here

相关问题