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

2024-04-23 07:41:55 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Index  data1  data2  data3
0      x0     x0     x0
1      x1     x1     x1
2      x2     x2     x2
...
n      xn     xn     xn

如何创建一个新的数据帧(使用pandas)并将每行的k个副本附加到其自身:

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
...

Tags: 数据pandasindex副本x1x2xndata1
3条回答

先浓缩,再分类

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

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

选项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

在这里使用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

相关问题 更多 >