Pandas 单列中的多索引到月-日格式
Pandas Multiindex to Month-Day format in a single column
我有一个 pandas 数据框,它有一个多索引月,然后是日,然后是一列数据值,看起来像这样:
Data
1 1 6
2 10
3 11
4 12
5 50
...
12 1 3
2 4
3 10
4 11
你明白了。我已经分组了月份和日期。
我想制作一个新列来一起格式化月份 - 日期。但似乎无法弄清楚。
期望的输出看起来像这样:
M-D Data
1-01 6
1-02 10
1-03 11
1-04 14
1-05 50
有人可以为此提供最佳解决方案吗?
注意:我之前使用以下代码创建了索引,也许我需要回去做一些重组?我将其设为多索引以便找到 min() 值。原始的 'Month' 和 'Day' 列在 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)
提前致谢!
如果需要把月和日格式化成m-d
,那么不从头分开是比较合理的做法,比如可以格式化成日期[=21] =] 列为 %m-%d
,按此变量分组并进行所需的聚合:
dframe.groupby(pd.to_datetime(dframe['Date']).dt.strftime('%m-%d'))['Data_Value'].min()
一个简短的例子:
dframe = pd.DataFrame({
'Date': ['2017-08-01', '2016-08-01', '2017-08-02'],
'Data_Value': [2,3,4]
})
dframe.groupby(pd.to_datetime(dframe['Date']).dt.strftime('%m-%d'))['Data_Value'].min()
#Date
#08-01 2
#08-02 4
#Name: Data_Value, dtype: int64
使用 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
我会采纳@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))])
我有一个 pandas 数据框,它有一个多索引月,然后是日,然后是一列数据值,看起来像这样:
Data
1 1 6
2 10
3 11
4 12
5 50
...
12 1 3
2 4
3 10
4 11
你明白了。我已经分组了月份和日期。 我想制作一个新列来一起格式化月份 - 日期。但似乎无法弄清楚。 期望的输出看起来像这样:
M-D Data
1-01 6
1-02 10
1-03 11
1-04 14
1-05 50
有人可以为此提供最佳解决方案吗? 注意:我之前使用以下代码创建了索引,也许我需要回去做一些重组?我将其设为多索引以便找到 min() 值。原始的 'Month' 和 'Day' 列在 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)
提前致谢!
如果需要把月和日格式化成m-d
,那么不从头分开是比较合理的做法,比如可以格式化成日期[=21] =] 列为 %m-%d
,按此变量分组并进行所需的聚合:
dframe.groupby(pd.to_datetime(dframe['Date']).dt.strftime('%m-%d'))['Data_Value'].min()
一个简短的例子:
dframe = pd.DataFrame({
'Date': ['2017-08-01', '2016-08-01', '2017-08-02'],
'Data_Value': [2,3,4]
})
dframe.groupby(pd.to_datetime(dframe['Date']).dt.strftime('%m-%d'))['Data_Value'].min()
#Date
#08-01 2
#08-02 4
#Name: Data_Value, dtype: int64
使用 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
我会采纳@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))])