Python: Pandas расширяет строку данных до более крупного блока данных [duplicate]

Давайте перепишем ваш код следующим образом:

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]] по той же причине, что и для первого шага.

27
задан lsheng 27 May 2014 в 12:09
поделиться

5 ответов

Вы можете использовать функцию 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
42
ответ дан joris 19 August 2018 в 12:49
поделиться

Я думаю, что теперь использовать 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).

6
ответ дан Andy Hayden 19 August 2018 в 12:49
поделиться

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

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

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

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

1
ответ дан FooBar 19 August 2018 в 12:49
поделиться
  • 1
    У меня есть кадр данных, который не имеет одной строки для каждого идентификатора. Я хочу вставить в нее эту строку, так что я собираюсь сделать это, чтобы повторить эту строку в течение N раз и добавить ее в исходный фрейм данных, а затем прибегнуть к ней. – lsheng 27 May 2014 в 12:37

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

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
0
ответ дан Surya 19 August 2018 в 12:49
поделиться
0
ответ дан U9-Forward 31 October 2018 в 00:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: