Подтвердить что ты не робот

Как повторить кадр данных Pandas?

Это мой кадр данных, который следует повторять 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

Но должен быть способ умнее, чем продолжать добавлять. Фактически кадр данных Im, работающий над, должен повторяться 50 раз.

Я не нашел ничего практичного, включая те, что похожи на np.repeat ---- он просто не работает с фреймом данных.

Может ли кто-нибудь помочь?

4b9b3361

Ответ 1

Вы можете использовать функцию 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

Ответ 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

В более общем плане вы можете использовать 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

Примечание. Это будет работать с не целочисленными индексированными DataFrames (и сериями).

Ответ 3

Я бы вообще не повторял и/или добавлял, если ваша проблема действительно не делает это необходимым - она ​​крайне неэффективна и обычно возникает из-за непонимания надлежащего способа атаки на проблему.

Я не знаю вашего конкретного варианта использования, но если у вас есть ваши значения, которые хранятся как

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

выполнит эту работу. Возможно, вы хотите лучше объяснить, чего вы пытаетесь достичь?

Ответ 4

Добавление тоже должно работать:

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