创建一个新的数据框,每行附加k个副本

时间:2017-11-12 17:02:31

标签: python pandas

假设我有一个包含n行的数据框:

Index  data1  data2  data3
0      x0     x0     x0
1      x0     x0     x0
...
k-1    x0     x0     x0
k      x1     x1     x1
k+1    x1     x1     x1
...
2k-1   x1     x1     x1
2k     x2     x2     x2
...

如何创建一个新数据框(使用pandas),每行附加k个副本:

{{1}}

3 个答案:

答案 0 :(得分:2)

首先连续,然后排序

我使用的方法是创建重复数据框列表,concat将它们放在一起,然后sort_index

count = 5
new_df = pd.concat([df]*count).sort_index()

答案 1 :(得分:2)

使用numpy.repeat.iloc在此处,k = 2

df.iloc[np.repeat(np.arange(len(df)), 3)]

Out[256]: 
   Index data1 data2 data3
0      0    x0    x0    x0
0      0    x0    x0    x0
0      0    x0    x0    x0
1      1    x1    x1    x1
1      1    x1    x1    x1
1      1    x1    x1    x1
2      2    x2    x2    x2
2      2    x2    x2    x2
2      2    x2    x2    x2

答案 2 :(得分:2)

选项1
使用repeat + reindex + reset_index

df

  data1 data2 data3
0    x0    x0    x0
1    x1    x1    x1
2    x2    x2    x2

df.reindex(df.index.repeat(5)).reset_index(drop=1)

   data1 data2 data3
0     x0    x0    x0
1     x0    x0    x0
2     x0    x0    x0
3     x0    x0    x0
4     x0    x0    x0
5     x1    x1    x1
6     x1    x1    x1
7     x1    x1    x1
8     x1    x1    x1
9     x1    x1    x1
10    x2    x2    x2
11    x2    x2    x2
12    x2    x2    x2
13    x2    x2    x2
14    x2    x2    x2

选项2
使用repeat + pd.DataFrame

的类似解决方案
pd.DataFrame(np.repeat(df.values, 5, axis=0), columns=df.columns)

   data1 data2 data3
0     x0    x0    x0
1     x0    x0    x0
2     x0    x0    x0
3     x0    x0    x0
4     x0    x0    x0
5     x1    x1    x1
6     x1    x1    x1
7     x1    x1    x1
8     x1    x1    x1
9     x1    x1    x1
10    x2    x2    x2
11    x2    x2    x2
12    x2    x2    x2
13    x2    x2    x2
14    x2    x2    x2

<强>比较

%timeit pd.concat([df] * 100000).sort_index().reset_index(drop=1)
1 loop, best of 3: 14.6 s per loop

%timeit df.iloc[np.repeat(np.arange(len(df)), 100000)].reset_index(drop=1)
10 loops, best of 3: 22.6 ms per loop

%timeit df.reindex(df.index.repeat(100000)).reset_index(drop=1)
10 loops, best of 3: 19.9 ms per loop

%timeit pd.DataFrame(np.repeat(df.values, 100000, axis=0), columns=df.columns)
100 loops, best of 3: 17.1 ms per loop