如何重复一个Pandas DataFrame?

80 投票
7 回答
98180 浏览
提问于 2025-04-18 07:42

这是我想要重复5次的数据表:

>>> x = pd.DataFrame({'a':1,'b':2}, index = range(1))
>>> x
   a  b
0  1  2

我希望得到这样的结果:

>>> x.append(x).append(x).append(x)
   a  b
0  1  2
0  1  2
0  1  2
0  1  2

不过,应该有比重复添加4次更聪明的方法。实际上,我正在处理的数据表应该重复50次。

我还没有找到什么实用的方法,包括像 np.repeat 这样的,它在数据表上就是不管用。

有人能帮忙吗?

7 个回答

2

追加(Append)也应该可以正常工作:

In [589]: x = pd.DataFrame({'a':1,'b':2},index = range(1))

In [590]: x
Out[590]: 
   a  b
0  1  2

In [591]: x.append([x]*5, ignore_index=True) #Ignores the index as per your need
Out[591]: 
   a  b
0  1  2
1  1  2
2  1  2
3  1  2
4  1  2
5  1  2

In [592]: x.append([x]*5)
Out[592]: 
   a  b
0  1  2
0  1  2
0  1  2
0  1  2
0  1  2
0  1  2
3

我一般不会重复或者添加内容,除非你的问题真的需要这样做——这样做效率很低,而且通常是因为没有找到解决问题的正确方法。

我不知道你具体的情况,但如果你的值是存储在

values = array(1, 2)
df2 = pd.DataFrame(index=arange(0,50),  columns=['a', 'b'])
df2[['a', 'b']] = values

这样就可以解决问题。也许你可以更详细地说明一下你想要实现的目标?

11

试试使用 numpy.repeat 这个功能:

>>> import numpy as np
>>> df = pd.DataFrame(np.repeat(x.to_numpy(), 5, axis=0), columns=x.columns)
>>> df
   a  b
0  1  2
1  1  2
2  1  2
3  1  2
4  1  2
36

我觉得现在用 iloc 会更简洁、更快:

In [11]: np.full(3, 0)
Out[11]: array([0, 0, 0])

In [12]: x.iloc[np.full(3, 0)]
Out[12]:
   a  b
0  1  2
0  1  2
0  1  2

更一般来说,你可以用 tile 或者 repeat 搭配 arange 来使用:

In [21]: df = pd.DataFrame([[1, 2], [3, 4]], columns=["A", "B"])

In [22]: df
Out[22]:
   A  B
0  1  2
1  3  4

In [23]: np.tile(np.arange(len(df)), 3)
Out[23]: array([0, 1, 0, 1, 0, 1])

In [24]: np.repeat(np.arange(len(df)), 3)
Out[24]: array([0, 0, 0, 1, 1, 1])

In [25]: df.iloc[np.tile(np.arange(len(df)), 3)]
Out[25]:
   A  B
0  1  2
1  3  4
0  1  2
1  3  4
0  1  2
1  3  4

In [26]: df.iloc[np.repeat(np.arange(len(df)), 3)]
Out[26]:
   A  B
0  1  2
0  1  2
0  1  2
1  3  4
1  3  4
1  3  4

注意:这也适用于非整数索引的 DataFrame(和 Series)。

131

你可以使用 concat 函数:

In [13]: pd.concat([x]*5)
Out[13]: 
   a  b
0  1  2
0  1  2
0  1  2
0  1  2
0  1  2

如果你只想重复值而不想重复索引,可以这样做:

In [14]: pd.concat([x]*5, ignore_index=True)
Out[14]: 
   a  b
0  1  2
1  1  2
2  1  2
3  1  2
4  1  2

撰写回答