我想使用布尔索引从pandas数据框中选择一个日期时间索引作为列标题的列:
dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.random.randn(4, 6), index=list('ABCD'), columns=dates)
返回:
2013-01-01 2013-01-02 2013-01-03 2013-01-04 2013-01-05 2013-01-06
A 0.173096 0.344348 1.059990 -1.246944 1.624399 -0.276052
B 0.277148 0.965226 -1.301612 -1.264500 -0.124489 1.704485
C -0.375106 0.103812 0.939749 -2.826329 -0.275420 0.664325
D 0.039756 0.631373 0.643565 -1.516543 -0.654626 -1.544038
我想只返回前三列。
答案 0 :(得分:8)
我可能会这样做
>>> df.loc[:, df.columns <= datetime(2013, 1, 3)]
2013-01-01 2013-01-02 2013-01-03
A 1.058112 0.883429 -1.939846
B 0.753125 1.664276 -0.619355
C 0.014437 1.125824 -1.421609
D 1.879229 1.594623 -1.499875
您可以直接对列索引进行矢量化比较,而无需使用map
/ lambda
组合。
答案 1 :(得分:1)
我与duck进行了很长时间的聊天,最终意识到这很简单:
print df.loc[:, :datetime(2013, 1, 3, 0, 0)]
我喜欢熊猫。
编辑:
嗯,实际上这并不是我想要的,因为它依赖于列标题中存在的“查询”日期。这实际上就是我所需要的:
print df.loc[:, df.columns.map(lambda col: col < datetime(2013, 1, 3, 0, 0))]