如何重复熊猫数据框架?

这是我的数据帧,应该重复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这样的软件——它在 DataFrame 上不起作用。

有人能帮忙吗?

84635 次浏览

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

我通常不会重复和/或附加,除非你的问题真的需要它-它是高度低效和 一般来说来自不理解正确的方式来解决一个问题。

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

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

也许你想更好地解释一下你想达到什么目的?

附加也应该起作用:

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

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

更一般地说,你可以使用 tilerepeatarange:

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

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

尝试使用 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

在我看来,应用 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

如果没有 numpy,我们也可以使用 Index.repeatloc(或 reindex) :

x.loc[x.index.repeat(5)].reset_index(drop=True)

或者

x.reindex(x.index.repeat(5)).reset_index(drop=True)

产出:

   a  b
0  1  2
1  1  2
2  1  2
3  1  2
4  1  2