Давайте перепишем ваш код следующим образом:
x = 1
y = [x]
z = y * 4
myList = [z] * 3
После этого запустите следующий код, чтобы сделать все более понятным. Что делает код, в основном печатает id
s полученных объектов, которые
Вернуть «идентификатор» объекта
и поможет нам идентифицировать их и проанализировать, что происходит:
print("myList:") for i, subList in enumerate(myList): print("\t[{}]: {}".format(i, id(subList))) for j, elem in enumerate(subList): print("\t\t[{}]: {}".format(j, id(elem)))
И вы получите следующий результат:
x: 1 y: [1] z: [1, 1, 1, 1] myList: [0]: 4300763792 [0]: 4298171528 [1]: 4298171528 [2]: 4298171528 [3]: 4298171528 [1]: 4300763792 [0]: 4298171528 [1]: 4298171528 [2]: 4298171528 [3]: 4298171528 [2]: 4300763792 [0]: 4298171528 [1]: 4298171528 [2]: 4298171528 [3]: 4298171528
Итак, теперь давайте шаг за шагом. У вас есть
x
, который является1
, и единственным списком элементовy
, содержащимx
. Ваш первый шаг -y * 4
, который даст вам новый списокz
, который в основном[x, x, x, x]
, т. Е. Создает новый список, который будет содержать 4 элемента, которые являются ссылками на исходный объектx
. Чистый шаг очень похож. В основном вы делаетеz * 3
, который является[[x, x, x, x]] * 3
и возвращает[[x, x, x, x], [x, x, x, x], [x, x, x, x]]
по той же причине, что и для первого шага.
Вы можете использовать функцию 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
Я думаю, что теперь использовать 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 (и Series).
Я бы вообще не повторял и / или добавлял, если только ваша проблема не делает это необходимым - это очень неэффективно, а обычно происходит из-за непонимания надлежащего способа атаки на проблему.
Я не знаю вашего конкретного варианта использования, но если у вас есть ваши значения, сохраненные как
,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