Pandas Multiindex为单日格式的单列

时间:2017-10-29 04:23:20

标签: python pandas datetime-format python-datetime

我有一个pandas数据框,其中包含Month的多索引,然后是Day,然后是一列数据值,如下所示:

      Data
1 1     6
  2     10
  3     11
  4     12
  5     50
   ...
12 1    3
   2    4
   3    10
   4    11

你明白了。我已经把月份和日期分组了。 我想创建一个新的列,将Month-Date格式化在一起。但似乎无法弄明白。 期望的输出看起来像这样:

M-D Data 
1-01 6
1-02 10
1-03 11
1-04 14
1-05 50

有人能为此提供最佳解决方案吗? 注意:我之前使用以下代码创建了索引,也许我需要回去做一些重组?我把它作为一个多索引,以便我可以找到min()值。最初的“月”和“日”列在10年的时间内有月和日,我只需要10年的最小值,因此groupby()。

dframe['Date'] = pd.to_datetime(dframe['Date'])
dframe['Month'], dframe['Day'] = dframe['Date'].dt.month, 
dframe['Date'].dt.day
finaldf = dframe.groupby(['Month','Day'])['Data_Value'].min()
df = pd.DataFrame(finaldf)

提前致谢!

3 个答案:

答案 0 :(得分:3)

如果您需要将月份和日期格式化为m-d,那么不要将它们与开头分开是一种更合理的方法,例如,您可以将 Date 列格式化为{ {1}},按此变量分组并执行所需的聚合:

%m-%d

一个简短的例子

dframe.groupby(pd.to_datetime(dframe['Date']).dt.strftime('%m-%d'))['Data_Value'].min()

答案 1 :(得分:2)

我会接受@ Psidom的建议。但是,要解决被问到的问题:
我使用format

df.assign(**{'M-D': df.index.map('{0[0]}-{0[1]}'.format).rename('M-D')})

      Data   M-D
1  1     6   1-1
   2    10   1-2
   3    11   1-3
   4    12   1-4
   5    50   1-5
12 1     3  12-1
   2     4  12-2
   3    10  12-3
   4    11  12-4

设置

df = pd.DataFrame(dict(
    Data=[6, 10, 11, 12, 50, 3, 4, 10, 11],
), [[1] * 5 + [12] * 4, list(range(1, 6)) + list(range(1, 5))])

答案 2 :(得分:0)

使用multiIndex有点棘手,我不确定这是非常有效的,但它确实有效:

df["M-D"] = [str(df.index[i][0])+'-'+str(df.index[i][1]) for i in range(len(df))]

它给出了以下结果:

In[143]: df.head()
Out[143]: 
           Open New_date
Month Day               
1     1    9597      1-1
      2    9370      1-2
      3    9365      1-3
      4    9766      1-4
      5    9446      1-5