如何重复Pandas数据帧?

时间:2014-05-27 11:09:41

标签: python pandas duplicates dataframe repeat

这是我的数据框,应该重复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

但是必须有一种比继续追加更聪明的方法..实际上我正在研究的数据框应该重复50次..

我还没有找到任何实用的东西,包括像np.repeat那样的东西 - 它只是在数据框架上工作。

有人可以帮忙吗?

6 个答案:

答案 0 :(得分:52)

您可以使用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

答案 1 :(得分:11)

我认为现在使用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使用repeatarange

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)。

答案 2 :(得分:1)

我通常不会重复和/或追加,除非你的问题真的有必要 - 它的效率非常低,通常来自于不理解正确的方法来解决问题。

我不知道您的确切用例,但如果您将值存储为

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

将完成这项工作。也许你想更好地解释你想要实现的目标?

答案 3 :(得分:0)

追加也应该有效:

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

答案 4 :(得分:0)

尝试使用numpy.repeat

>>> df=pd.DataFrame(pd.np.repeat(x.values,5,axis=0),columns=x.columns)
>>> df
   a  b
0  1  2
1  1  2
2  1  2
3  1  2
4  1  2
>>> 

答案 5 :(得分:0)

在我看来,通过 row-lambda 应用是一种通用方法:

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

df.apply(lambda row: row.repeat(2), axis=0) #.reset_index()

Out[1]: 
    A   B
0   1   2
0   1   2
1   3   4
1   3   4