При добавлении к спискам в кадре данных с помощью для l oop в Python, почему он добавляется в каждую строку? - PullRequest
1 голос
/ 16 апреля 2020

У меня есть фрейм данных со столбцами area и price, и я создал новый столбец пустых списков с именем compList.

. Я использую для l oop заполнение * 1006. * для каждой строки с ценами любых других домов с таким же значением area.

Я ищу результат для data['compList'], равным [] для всех area значений, кроме первый и последний, которые оба имеют area 1500, где значения compList должны иметь одно значение, 31000 и 30000 соответственно. Вместо этого я получаю [30000, 31000] за каждое значение compList.

Что не так с моим кодом? 2 часа ломал голову, пытаясь понять это. Ваша помощь будет принята с благодарностью.

import pandas as pd
import numpy as np
import collections

reqArea = 1200
area = [1500, 500, 1000, 2000, 2500, 1500]
price = [30000, 10000, 20000, 40000, 50000, 31000]

data = pd.DataFrame(list(zip(area,price)), columns = ['area','price'])
data['compList'] = [[]]*len(data['area'])

На этом этапе мой фрейм данных выглядит так:

   area  price compList
0  1500  30000       []
1   500  10000       []
2  1000  20000       []
3  2000  40000       []
4  2500  50000       []
5  1500  31000       []

Затем я его обрабатываю.

for i in range(len(data['area'])):

    sameArea = []
    sameArea = np.where(data['area'] == data['area'][i])[0]

    if len(sameArea)>1:
        for j in range(len(sameArea)):
            if sameArea[j] != i:
                data['compList'][i].append(data['price'][sameArea[j]])

    else:
        pass

В конце мой фрейм данных выглядит так:

   area  price        compList
0  1500  30000  [31000, 30000]
1   500  10000  [31000, 30000]
2  1000  20000  [31000, 30000]
3  2000  40000  [31000, 30000]
4  2500  50000  [31000, 30000]
5  1500  31000  [31000, 30000]

1 Ответ

2 голосов
/ 16 апреля 2020

[[]] * n - это n ссылок на один и тот же объект. Как только вы добавляете data['compList'][i].append(data['price'][sameArea[j]]), вы в основном добавляете элементы вашего столбца compList (которые по сути являются одним объектом). Попробуйте это:

reqArea = 1200

area = [1500, 500, 1000, 2000, 2500, 1500]

price = [30000, 10000, 20000, 40000, 50000, 31000]

data = pd.DataFrame(list(zip(area,price)), columns = ['area','price'])

data['compList'] = np.empty((len(data), 0)).tolist()

Вывод с использованием остальной части вашего кода:

   area  price compList
0  1500  30000  [31000]
1   500  10000       []
2  1000  20000       []
3  2000  40000       []
4  2500  50000       []
5  1500  31000  [30000]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...