在python中使用顶部和侧面标题转换表

时间:2018-02-10 00:07:05

标签: python pandas

我有一张目前采用这种格式的表格:

import pandas as pd

dic = {
   201801 : {'A': 2.4, 'B': 3.4, 'C': 4.4, 'D': 5.4, },
   201802 : {'A': 2.4, 'B': 3.4, 'C': 4.4, 'D': 5.4, },
   201803 : {'A': 2.4, 'B': 3.4, 'C': 4.4, 'D': 5.4, }, 
   201804 : {'A': 2.4, 'B': 3.4, 'C': 4.4, 'D': 5.4, }, 
   201805 : {'A': 2.4, 'B': 3.4, 'C': 4.4, 'D': 5.4, }, 
   201806 : {'A': 2.4, 'B': 3.4, 'C': 4.4, 'D': 5.4, }, 
   201807 : {'A': 2.4, 'B': 3.4, 'C': 4.4, 'D': 5.4, }, 
   }

df2 = pd.DataFrame(dic)
print(df2)

输出:

    201801  201802  201803  201804  201805  201806  201807
A     2.4     2.4     2.4     2.4     2.4     2.4     2.4
B     3.4     3.4     3.4     3.4     3.4     3.4     3.4
C     4.4     4.4     4.4     4.4     4.4     4.4     4.4
D     5.4     5.4     5.4     5.4     5.4     5.4     5.4

我想将此表格转换为以下格式:

201801      A   2.4
201801      B   3.4
201801      C   4.4
201801      D   5.4
201802      A   2.4
201802      B   3.4
201802      C   4.4
201802      D   5.4
201803      A   2.4
201803      B   3.4
201803      C   4.4
201803      D   5.4
201804      A   2.4
201804      B   3.4
201804      C   4.4
201804      D   5.4

如何使用Python Pandas执行此操作?

2 个答案:

答案 0 :(得分:0)

您似乎希望将数据从宽格式转换为长格式。您可以转置数据然后将其堆叠起来:

df2.T.stack()

201801  A    2.4
        B    3.4
        C    4.4
        D    5.4
201802  A    2.4
        B    3.4
        C    4.4
        D    5.4
# ...

或者,您可以使用df2.stack().swaplevel(),但这将通过"字母排序"索引,默认情况下不是日期。

比较两者,第一个要快得多。

%timeit df2.T.stack()
693 µs ± 131 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit df2.stack().swaplevel().sort_index()
2.64 ms ± 182 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

答案 1 :(得分:0)

如上所述,只需使用pandas melt重塑宽到长的格式:

# RESET INDEX AS A REGULAR COLUMN
df = df.reset_index()

# MELT WIDE TO LONG FORMAT
finaldf = pd.melt(df, id_vars='index', var_name='year_month')