根据值重复Pandas数据帧,并将计数器添加回数据帧

时间:2018-03-30 00:52:01

标签: python python-3.x pandas

假设您有以下数据框:

item_a item_b
1       123
7       32   
4       18

然后你有一个常量`PERIODS = 3',我如何重复上述数据帧3次,同时将每次重复添加为计数器。

期望的结果是:

counter item_a item_b
1       1       123
1       7       32   
1       4       18
2       1       123
2       7       32   
2       4       18
3       1       123
3       7       32   
3       4       18

2 个答案:

答案 0 :(得分:2)

IIUC使用reindex,然后我们使用groupby cumcount

重新创建索引
s=df.reindex(df.index.tolist()*3)
s.index=s.groupby(s.index).cumcount()+1
s
Out[1349]: 
   item_a  item_b
1       1     123
1       7      32
1       4      18
2       1     123
2       7      32
2       4      18
3       1     123
3       7      32
3       4      18

答案 1 :(得分:1)

这是另一种方法,它简单地连接你的df,但是你想要多次,将索引设置为每次连接逐渐增加的常量:

import numpy as np

period=3

new_df = pd.concat([df.set_index(np.repeat(i, len(df))) for i in range(1,period+1)])

>>> new_df
   item_a  item_b
1       1     123
1       7      32
1       4      18
2       1     123
2       7      32
2       4      18
3       1     123
3       7      32
3       4      18

# Or, to have counter as a separate column rather than the index:
new_df = pd.concat([df.assign(counter=np.repeat(i, len(df))) 
                    for i in range(1,period+1)]).reset_index(drop=True) 

解决方案2

从您的评论中看,您正在寻找快速执行代码,此方法更快:

new_df = pd.DataFrame(np.repeat([df.values],period, axis=0).reshape(-1,df.shape[1]), 
             index=np.repeat(range(1,period+1), len(df)), columns=df.columns)