Python 在dataframe上迭代并创建另一个具有重复记录的dataframe

Python 在dataframe上迭代并创建另一个具有重复记录的dataframe,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个数据框act,列为['id','start-yr','end-yr'] 我想创建另一个数据框timeline,列为['id','years'] 使用actdf。因此,如果act的字段为 ids start-yr end-yr -------------------------------- 'IAs728-ahe83j' 2014 2016 'J8273nbajsu-193h' 2012 2018 我希望timelinedf像这样填充: ids

我有一个数据框
act
,列为
['id','start-yr','end-yr']

我想创建另一个数据框
timeline
,列为
['id','years']

使用
act
df。因此,如果
act
的字段为

ids             start-yr end-yr
--------------------------------
'IAs728-ahe83j'    2014    2016
'J8273nbajsu-193h' 2012    2018
我希望
timeline
df像这样填充:

ids                years
------------------------
'IAs728-ahe83j'     2014
'IAs728-ahe83j'     2015
'IAs728-ahe83j'     2016
'J8273nbajsu-193h'  2012
'J8273nbajsu-193h'  2013
'J8273nbajsu-193h'  2014
'J8273nbajsu-193h'  2015
'J8273nbajsu-193h'  2016
'J8273nbajsu-193h'  2017
'J8273nbajsu-193h'  2018
我迄今为止的努力:

timeline = pd.DataFrame(columns=['ids','years'])

cnt = 0
for ix, row in act.iterrows():
    for yr in range(int(row['start-yr']), int(row['end-yr'])+1, 1):
        timeline[cnt, 'ids'] = row['ids']
        timeline[cnt, 'years'] = yr
        cnt += 1
但这是一个非常昂贵的操作,太多的时间消耗(这是显而易见的,我知道)。那么,在这种情况下,用什么样的pythonic方法来填充熊猫df呢?

非常感谢您的帮助。

对于元组列表和
数据帧
构造函数,请使用列表理解和
范围

a = [(i, x) for i, a, b in df.values for x in range(a, b + 1)]
df = pd.DataFrame(a, columns=['ids','years'])
print (df)
                  ids  years
0     'IAs728-ahe83j'   2014
1     'IAs728-ahe83j'   2015
2     'IAs728-ahe83j'   2016
3  'J8273nbajsu-193h'   2012
4  'J8273nbajsu-193h'   2013
5  'J8273nbajsu-193h'   2014
6  'J8273nbajsu-193h'   2015
7  'J8273nbajsu-193h'   2016
8  'J8273nbajsu-193h'   2017
9  'J8273nbajsu-193h'   2018
如果可能,
DataFrame
中有多个列,请按列表进行筛选:

c = ['ids','start-yr','end-yr']
a = [(i, x) for i, a, b in df[c].values for x in range(a, b + 1)]

哇!你真是个天才,杰兹雷尔。这只需要0.38秒。你能解释一下为什么这种方法花费的计算时间这么少吗。对不起,这个愚蠢的问题。我是哑巴。再次感谢。@AmanSingh-因为
iterrows
用于按系列循环,而且非常昂贵。所以纯python解决方案工作得非常快。