微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在熊猫中有效展开日期范围?

我有一个Pandas数据帧(attendance_records).它包含当地学校的出勤记录.

每行有4列:1)缺席的学生姓名(姓名),2)学生的地址(地址),3)缺席的第一天(开始),以及4)缺席的最后一天(结束).

例如,一行可以是:

Bobby   101 1st Street  9/1/2014     9/3/2014

这意味着Bobby每天都在9/1和9/3之间缺席(包括在内).

我想展开表格如下:

Bobby 101 1st Street 9/1/2014
Bobby 101 1st Street 9/2/2014
Bobby 101 1st Street 9/3/2014

到目前为止,我有一些代码(下面)可以完成这项工作,但它在大型表上的速度非常慢,因为它基本上是逐行遍历表.关于如何让事情变得更快的任何想法?

import pandas as pd
def full_data(dataframe):
    allframe = pd.DataFrame()
    for i in dataframe.index:
        newframe = pd.DataFrame()
        newframe['dates'] = pd.date_range(dataframe.iloc[i].start, dataframe.iloc[i].end, freq = 'D')
        newframe['name'] = dataframe.iloc[i]['name']
        newframe['address'] = dataframe.iloc[i]['address']            
        allframe = allframe.append(newframe)
        if i%1000 == 0:
            print i
    return allframe

attendance_records = full_data(attendance_records)

解决方法:

对于较大的数据帧,pandas函数append可能会很慢.相反,我建议将新帧存储在python列表中,而不是使用仅将所有帧附加一次的concat函数.

import pandas as pd
def full_data(dataframe):
    allframes = []
    for i in dataframe.index:
        newframe = pd.DataFrame()
        newframe['dates'] = pd.date_range(dataframe.iloc[i].start, dataframe.iloc[i].end, freq = 'D')
        newframe['name'] = dataframe.iloc[i]['name']
        newframe['address'] = dataframe.iloc[i]['address']            
        allframes.append(newframe)
    return concat(allframes)

请注意,这尚未经过测试.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐