Почему использование == возвращает серию вместо bool в пандах?

Я просто не могу понять, что означает "==" во второй строке:
- Это не тест, нет оператора if...
- Это не объявление переменной...

Я никогда раньше этого не видел, дело в том, что data.ctage==cat - это серия панд, а не тест...

for cat in data["categ"].unique():
    subset = data[data.categ == cat] # Création du sous-échantillon
    print("-"*20)
    print('Catégorie : ' + cat)
    print("moyenne:\n",subset['montant'].mean())
    print("mediane:\n",subset['montant'].median())
    print("mode:\n",subset['montant'].mode())
    print("VAR:\n",subset['montant'].var())
    print("EC:\n",subset['montant'].std())
    plt.figure(figsize=(5,5))
    subset["montant"].hist(bins=30) # Crée l'histogramme
    plt.show() # Affiche l'histogramme

person Amaumox    schedule 20.04.2020    source источник
comment
Может быть, они выполняют поэлементное сравнение двух массивов numpy и используют полученный логический массив в качестве селектора данных? stackoverflow.com/ вопросов/10580676/ Панды странные.   -  person Neil    schedule 20.04.2020
comment
Это маска наподобие positive_X = X[X > 0] из numpy.   -  person Guimoute    schedule 20.04.2020


Ответы (5)


Он проверяет каждый элемент data.categ на равенство с cat. Это создает вектор значений True/False. Это передается, как и в индексаторе, в data[], который возвращает строки из data, которые соответствуют значениям True в векторе.

Подводя итог, все выражение возвращает подмножество строк из data, где значение data.categ равно cat.

(Кажется, всю операцию можно было бы сделать более элегантно, используя data.groupBy('categ').apply(someFunc).)

person Dave Costa    schedule 20.04.2020

Он создает логический ряд с индексами, где data.categ равен cat , с помощью этой логической маски вы можете фильтровать свой фрейм данных, другими словами, subset будет иметь все записи, где categ - это значение, хранящееся в cat.

Это пример использования числовых данных

np.random.seed(0)
a = np.random.choice(np.arange(2), 5)
b = np.random.choice(np.arange(2), 5)
df = pd.DataFrame(dict(a = a, b = b))


df[df.a == 0].head()

#   a   b
# 0 0   0
# 2 0   0
# 4 0   1

df[df.a == df.b].head()

#   a   b
# 0 0   0
# 2 0   0
# 3 1   1
person jcaliz    schedule 20.04.2020

Да, это это тест. Логические выражения не ограничены if операторами.

Похоже, что data — это фрейм данных (PANDAS). Выражение, используемое в качестве индекса фрейма данных, — это то, как PANDAS обозначает селектор или фильтр. Это говорит о выборе каждой строки, в которой поле categ соответствует переменной cat (очевидно, предопределенной переменной). Этот набор строк становится новым фреймом данных, subset.

person Prune    schedule 20.04.2020

data.categ == cat вернет логический список, который будет использоваться для фильтрации вашего фрейма данных, оставив только значения, где логическое значение равно True.

Логические значения используются во многих ситуациях, не только в операторах if.

person Henrique Branco    schedule 20.04.2020

Здесь вы проверяете data.categ с повторяющимся элементом cat в словаре data.
И если они равны, вы продолжаете цикл.

person Harshit Ruwali    schedule 20.04.2020