Как я понимаю группировку[l].size()?

Я пытаюсь понять следующий код grouped[l].size(), например:

f = 10
n = 250
np.random.seed(100)
x = np.random.randint(0,2,(n,f))
y = np.random.randint(0,2,n)
fcols = [f'f{_}' for _ in range(f)]
data = pd.DataFrame(x, columns = fcols)
data['l'] = y
grouped = data.groupby(list(data.columns))
print(grouped['l'].size())

почему он печатает так:

f0  f1  f2  f3  f4  f5  f6  f7  f8  f9  l
0   0   0   0   0   0   0   1   1   1   1    1
                        1   0   1   0   0    1
                                        1    1
                                    1   1    1
                    1   0   0   0   0   0    1
                                            ..
1   1   1   1   1   0   0   0   0   0   1    1
                            1   0   0   0    1
                        1   1   0   0   1    1
                    1   1   0   0   0   0    1
                            1   0   1   1    2
Name: l, Length: 239, dtype: int64

Я прочитал это на официальном сайте: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.groupby.html

Вот что меня смущает: l имеет значение либо 0, либо 1, поэтому, когда оно используется в качестве группового условия, выходные данные l также должны иметь только 0 или 1, 2 строки на выходе с Length 2 (теперь это Length 239). на мой взгляд, приведенный выше вывод должен иметь такую ​​форму:

f0  f1  f2  f3  f4  f5  f6  f7  f8  f9  l
0   0   0   0   0   0   0   1   1   1   1    1
                        1   0   1   0   0    2 
  1. ПОЧЕМУ длина равна 239, а не 2?
  2. ПОЧЕМУ многие столбцы f пусты и не имеют никакого значения?

«когда [l] используется как условие группы...», но вы не используете только l в качестве группы, вы группируете по list(data.columns), то есть по всем столбцам. Таким образом, практически любая строка представляет собой уникальную комбинацию и, следовательно, представляет собой собственную группу. Насчет пробелов: это потому, что в результате эти значения находятся в индексе. Т.е. пустые ячейки такие же, как и ячейки над ними (попробуйте: print(grouped['l'].size().index), и вы увидите, что эти пробелы во вторых строках тоже являются нулями. То, что вы хотите сделать, это просто: data.groupby('l').size().

ouroboros1 20.08.2024 12:18
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Почему длина равна 239, а не 2?

groupby.size (который при его использовании можно заменить на value_counts) будет учитывать комбинации столбцов.

В вашем случае у вас есть 239 уникальных комбинаций всех столбцов из 250 строк.

Здесь вы используете не l в качестве группера, а весь столбец (list(data.columns)). Для группировки по l вам понадобится:

data.groupby('l').size()

# or
# data['l'].value_counts()

# l
# 0    130
# 1    120
# dtype: int64

Почему многие столбцы f пусты и не имеют никакого значения?

«Пустые» значения в MultiIndex в ваших выводах — это всего лишь способ представить значения, равные предыдущим. Поскольку groupby сортирует группу по умолчанию, индексы часто будут похожи на предыдущие, и этот эффект будет вполне очевиден.

Если вы используете reset_index(), вы увидите, что значения действительно есть.

Я также пробовал другой индекс, например grouped[f0].size(), и результаты были одинаковыми. Я думаю, это потому, что size предназначен для каждой уникальной комбинации, а не для индекса (f0 или f1...).

Tiina 21.08.2024 03:35

Другие вопросы по теме