Как повторить кадр данных 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
---- он просто не работает с фреймом данных.
Может ли кто-нибудь помочь?
Ответы
Ответ 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