Python 熊猫:当索引为年-月,列为日时,将数据帧转换为系列
我有一个看起来类似于以下内容的数据帧:Python 熊猫:当索引为年-月,列为日时,将数据帧转换为系列,python,pandas,Python,Pandas,我有一个看起来类似于以下内容的数据帧: df = pd.DataFrame({'Y_M':['201710','201711','201712'],'1':[1,5,9],'2':[2,6,10],'3':[3,7,11],'4':[4,8,12]}) df = df.set_index('Y_M') Y_M 20171001 1 20171002 2 20171003 3 20171004 4 20171101 5 20171
df = pd.DataFrame({'Y_M':['201710','201711','201712'],'1':[1,5,9],'2':[2,6,10],'3':[3,7,11],'4':[4,8,12]})
df = df.set_index('Y_M')
Y_M
20171001 1
20171002 2
20171003 3
20171004 4
20171101 5
20171102 6
20171103 7
20171104 8
20171201 9
20171202 10
20171203 11
20171204 12
这将创建如下所示的数据帧:
1 2 3 4
Y_M
201711 1 2 3 4
201712 5 6 7 8
201713 9 10 11 12
这些列是一个月的第几天。他们向右延伸,一直延伸到31岁。(2月份的第29、30和31列将填充NaN)。
该指数包含年份和月份(例如201711指2017年11月)
我的问题是:我怎样才能把它做成一个单一的系列,把年/月/日结合起来?我的输出如下:
df = pd.DataFrame({'Y_M':['201710','201711','201712'],'1':[1,5,9],'2':[2,6,10],'3':[3,7,11],'4':[4,8,12]})
df = df.set_index('Y_M')
Y_M
20171001 1
20171002 2
20171003 3
20171004 4
20171101 5
20171102 6
20171103 7
20171104 8
20171201 9
20171202 10
20171203 11
20171204 12
该索引可以转换为日期时间。事实上,我认为这样做会更容易 用于系列
,然后将datetimes
by与timedelta
by组合使用
:
最后,如有必要,在索引中添加字符串(不是日期时间索引)添加:
不带日期
s = df.stack()
s.index = s.index.map('{0[0]}{0[1]:>02s}'.format)
s
20171001 1
20171002 2
20171003 3
20171004 4
20171101 5
20171102 6
20171103 7
20171104 8
20171201 9
20171202 10
20171203 11
20171204 12
dtype: int64
堆栈正是我需要的函数!谢谢你@jezrael!不客气!如果我的答案有用,别忘了-点击复选标记(✓答案旁边的代码>),将其从灰显切换为填充。谢谢,哇。这是一个很好的方法!也允许对非日期值执行此操作。不过我不太明白。在index.map()
中,您向它传递一个字符串,该字符串指示它映射的内容。它访问层次索引“0”,即级别0和1。但我不知道什么是:>02s
,也不知道为什么这也适用于原始“day”列中的两位数值。pd.Index.map
接受一个可调用的并将每个索引值传递给它。在本例中,索引是一个多索引。因此,传递给可调用对象的每个值都是一个元组。知道了这一点,我设计了一个字符串格式化可调用函数来处理它。你可以用字符串格式做很多稀奇古怪的事情,我不能在这里全部介绍,但我要说的是,我希望元组{0[0]}
的第一个元素在前面,元组{0[1]}
的第二个元素在后面。然而,我给它添加了一些对齐魔法{0[1]:>02s}
要求将字符串向右对齐,并使用缓冲区2填充0
。感谢您的详细解释!这太棒了。