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解决方案工作得非常快。