我有一个excel文件,其中列名由日期时间值组成。
正如您所见,标题值采用日期时间格式。我已将此加载到Pandas数据帧,标题值确实保存为日期时间值。
现在,如果我需要从Pandas查询,例如,"选择所有大于5月15日和#34的列;我怎么能这样做?
我知道通过查询df[df.columns[3:]]
我可以做到这一点。但我真的想根据列标题的值进行切片,而不是基于列的位置。
请帮忙。
修改: 根据下面的答案,我找到了一种查询列值的方法。将其添加到此处以供将来参考。
from datetime import datetime
df[[col for col in df.columns if col not in ("Name", "Location")
and col >= datetime(2015,4,1)
and col <= datetime(2016,3,1)]]
或
from datetime import datetime
df.loc[:, [col for col in df.columns if col not in ("Name", "Location")
and col >= datetime(2015,4,1)
and col <= datetime(2016,3,1)]]
第一种解决方案是最优雅的。 从概念上讲,当预期列作为列表提供时,Pandas中的列切片工作。 List comprehenion用于根据列标签值对列进行切片。 (不是列中的值)。在示例中,我已经过滤掉了#34;名称&#34;和&#34;位置&#34;列,因为我正在根据数据时间值比较剩余的列。
答案 0 :(得分:2)
查询最适合根据一个或多个变量(列)过滤观察(行)。您的数据组织方式不允许自然查询(您尝试过滤列而不是将其用作过滤器中的条件)。您可以阅读有关computed value
的更多信息当然,您可以采取扭曲的方式来做您想做的事情,但我强烈建议您像这样整理您的数据
name | location | date | value
--------------------------------
John | London | Apr-15 | 1000
John | London | May-15 | 800
...
然后您可以根据Date
轻松查询,并确保该列属于日期类型,以便您可以使用例如。
df.query('20150501 < date')
然后,当您完成后,如果需要,您可以随时将数据帧恢复为原始格式(如果可以的话,最好避免它并专注于组织数据,它会支付长期运行)
答案 1 :(得分:1)
一种易于修复的方法是将Month字符串替换为其等效数字。
dct = {'Jan': 1, 'Feb':2 ...}
new = []
for item in df.columns:
a = item.split('-')
try:
b= '%02d.%02d' %(a[1],a[0])
except: # if not a datetime i.e. 'name'
b= str(a[0])
new.append(b)
df.columns=new
这应该使您的日期格式为15.04,15.05 .. 16.11等。
另外:您还可以将标题转换为日期时间并以这种方式查询:
from datetime import datetime
new=[]
for item in df.columns:
try:
new.append( datetime.strptime( item , '%b-%y') )
except:
new.append( item )
df.columns=new
df.loc[:, df.columns <= datetime(2015, 5, 1)]