python - 如何有效地展开 Pandas 中的日期范围跨度?

标签 python pandas

我有一个 Pandas 数据框 (attendance_records)。它包含本地学校的出勤记录。

每一行有 4 列:1) 缺勤学生的姓名 (name),2) 学生的地址 (address),3) 第一天缺勤 (start),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 可能会很慢。相反,我建议将 newframes 存储在 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)

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

关于python - 如何有效地展开 Pandas 中的日期范围跨度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25894931/

相关文章:

python - 使用 Python 和 XenAPI 模块列出 XenCenter list

python - 基于两列合并数据框

python - 具有最小冲突的短 Python 字母数字哈希

python - 兰德兰奇结果有帮助吗? Python 随机数生成器

javascript - 使用 javascript-ajax Django 在 <a> html 中获取特定值

python - Pandas df.loc 比较浮点条件从不工作

python - 日期时间转换 - 如何提取推断格式?

python - axis = 0 似乎在 sum() 和 dropna() 中表现不同

python - 如果它符合 python 中的条件,则查找并比较组中的最后一行和之前的行

python - 将txt文件解析为2个csv文件