Я пытаюсь понять следующий код 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
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
«Пустые» значения в MultiIndex в ваших выводах — это всего лишь способ представить значения, равные предыдущим. Поскольку groupby
сортирует группу по умолчанию, индексы часто будут похожи на предыдущие, и этот эффект будет вполне очевиден.
Если вы используете reset_index()
, вы увидите, что значения действительно есть.
Я также пробовал другой индекс, например grouped[f0].size()
, и результаты были одинаковыми. Я думаю, это потому, что size
предназначен для каждой уникальной комбинации, а не для индекса (f0 или f1...).
«когда [
l
] используется как условие группы...», но вы не используете толькоl
в качестве группы, вы группируете поlist(data.columns)
, то есть по всем столбцам. Таким образом, практически любая строка представляет собой уникальную комбинацию и, следовательно, представляет собой собственную группу. Насчет пробелов: это потому, что в результате эти значения находятся в индексе. Т.е. пустые ячейки такие же, как и ячейки над ними (попробуйте:print(grouped['l'].size().index)
, и вы увидите, что эти пробелы во вторых строках тоже являются нулями. То, что вы хотите сделать, это просто:data.groupby('l').size()
.