我有一个 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/