Как использовать вложенные циклы for в python? - PullRequest
0 голосов
/ 07 августа 2020

Я пытаюсь создать массив на основе значений из другого фрейма данных в Python. Я хочу, чтобы он заполнил массив как таковой.

If x > or = 3 in the dataframe then it inputs a 0 in the array. 
If x < 3 in the dataframe then it inputs a 1 in the array.  
If x = 0 in the dataframe then it inputs a 0 in the array.

Ниже приведен код, который у меня есть до сих пор, но результат получается как просто [0]

array = np.array([])

for x in df["disc"]:
    for y in array:    
        if x >= 3:
            y=0
        elif x < 3:
            y=1
        else:
            y=0

Любая помощь будет буду очень признателен, спасибо.

Ответы [ 3 ]

2 голосов
/ 07 августа 2020

При работе с массивами numpy будет более эффективно, если вы вообще сможете избежать использования явных циклов в Python. (Фактический цикл происходит внутри скомпилированного кода C.)

disc = df["disc"]

# make an array containing 0 where disc >= 3, elsewhere 1
array = np.where(disc >= 3, 0, 1)

# now set it equal to 0 in any places where disc == 0
array[disc == 0] = 0

Это также может быть выполнено в одном операторе (кроме начального присвоения disc), используя:

array = np.where((disc >= 3) | (disc == 0), 0, 1)

Здесь | выполняет "или" поэлементную проверку логических массивов. (Он имеет более высокий приоритет, чем операторы сравнения, поэтому необходимо заключить сравнения в круглые скобки.)

0 голосов
/ 07 августа 2020

Кажется, ваш код ничего не делает с массивом, поскольку вы пытаетесь изменить переменную y, а не сам массив. y не ссылается на массив, он просто содержит найденные значения. Второй l oop также ничего не делает из-за того, что массив пуст - он проходит через 0 элементов. Что вам нужно, а не другой for l oop, так это просто добавить в массив.

Со списком вы должны использовать метод .append() для добавления элемента, однако, как вам кажется, используя numpy, вы захотите использовать функцию append(arr, values), которую он предоставляет, например:

array = np.array([])

for x in df["disc"]:  
    if x >= 3:
        array = np.append(array, 0)
    elif x < 3:
        array = np.append(array, 1)
    else:
        array = np.append(array, 0)

Я также отмечу, что эти условия можно упростить, чтобы объединить две ветви, которые добавляют 0. А именно, если x <3 и x не равно 0, добавьте 1, иначе добавьте 0. Таким образом, код можно переписать следующим образом. </p>

array = np.array([])

for x in df["disc"]:  
    if x < 3 and x != 0:
        array = np.append(array, 1)
    else:
        array = np.append(array, 0)
0 голосов
/ 07 августа 2020

Это простая проблема. Есть много способов решить эту проблему, я думаю, что самый простой способ - использовать список. Вы можете использовать список и добавлять значения в соответствии с условиями.

array = []

for x in df["disc"]:
   if x >= 3:
       array.append(0)
   elif x < 3:
       array.append(1)
   else:
       array.append(0)
...