猿问

从另一个数据帧创建熊猫数据帧的更快方法

我有一个包含超过 41500 条记录和 3 个字段的数据框ID:start_date和end_date.


我想从中创建一个单独的数据框,其中只有 2 个字段为:ID并将active_years包含每个标识符的记录,这些记录针对 start_year 和 end_year 范围之间存在的所有可能年份(包括该范围内的结束年份)。


这就是我现在正在做的事情,但是对于 41500 行,它需要 2 个多小时才能完成。


df = pd.DataFrame(columns=['id', 'active_years'])

ix = 0


for _, row in raw_dataset.iterrows():


    st_yr = int(row['start_date'].split('-')[0]) # because dates are in the format yyyy-mm-dd

    end_yr = int(row['end_date'].split('-')[0])


    for year in range(st_yr, end_yr+1):


        df.loc[ix, 'id'] = row['ID']

        df.loc[ix, 'active_years'] = year

        ix = ix + 1

那么有没有更快的方法来实现这一点?


[编辑]一些尝试解决的示例,


raw_dataset = pd.DataFrame({'ID':['a121','b142','cd3'],'start_date':['2019-10-09','2017-02-06','2012-12-05'],'end_date':['2020-01-30','2019-08-23','2016-06-18']})


print(raw_dataset)

     ID  start_date    end_date

0  a121  2019-10-09  2020-01-30

1  b142  2017-02-06  2019-08-23

2   cd3  2012-12-05  2016-06-18


# the desired dataframe should look like this

print(desired_df)

     id  active_years

0  a121  2019

1  a121  2020

2  b142  2017

3  b142  2018

4  b142  2019

5   cd3  2012

6   cd3  2013

7   cd3  2014

8   cd3  2015

9   cd3  2016


红颜莎娜
浏览 103回答 1
1回答

函数式编程

动态增长的 python 列表比动态增长的 numpy 数组(这是 pandas 数据帧的底层数据结构)快得多。请参阅此处以获取简要说明。考虑到这一点:import pandas as pd# Initialize input dataframeraw_dataset = pd.DataFrame({    'ID':['a121','b142','cd3'],    'start_date':['2019-10-09','2017-02-06','2012-12-05'],    'end_date':['2020-01-30','2019-08-23','2016-06-18'],})# Create integer columns for start year and end yearraw_dataset['start_year'] = pd.to_datetime(raw_dataset['start_date']).dt.yearraw_dataset['end_year'] = pd.to_datetime(raw_dataset['end_date']).dt.year# Iterate over input dataframe rows and individual yearsid_list = []active_years_list = []for row in raw_dataset.itertuples():    for year in range(row.start_year, row.end_year+1):        id_list.append(row.ID)        active_years_list.append(year)# Create result dataframe from listsdesired_df = pd.DataFrame({    'id': id_list,    'active_years': active_years_list,})print(desired_df)# Output:#     id  active_years# 0  a121          2019# 1  a121          2020# 2  b142          2017# 3  b142          2018# 4  b142          2019# 5   cd3          2012# 6   cd3          2013# 7   cd3          2014# 8   cd3          2015# 9   cd3          2016
随时随地看视频慕课网APP

相关分类

Python
我要回答