Я пытаюсь расширить программу на Python. В настоящее время он использует groupby для выполнения некоторой работы по сегментации.
Расширение позволит рядам находиться в нескольких группах. Я не уверен, позволяет ли groupby это или как имитировать это. Или, если мне просто придется заново реализовать всю функциональность ...
У меня нет действительно хорошего примера, потому что я не уверен, как бы я это представил ..
Ниже представлены три ВОЗМОЖНЫХ представления данных. Любой будет хорошо, или другие. Мне просто нужно, чтобы они могли привести пример, и я не хочу ограничивать ответы одним конкретным форматом данных.
Version1 Существует один столбец 'grp', и он может иметь несколько значений (разделенных запятыми, но может быть любым):
In [9]: v1
Out[9]:
name value grp
0 a 34 x
1 b 98 x,y
2 c 8 y
3 d 3 z
Version2 каждое возможное значение группыимеет столбец 1/0:
In [14]: v2
Out[14]:
name value x y z
0 a 34 1 0 0
1 b 98 1 1 0
2 c 8 0 1 0
3 d 3 0 0 1
В версии 3 есть 3 столбца grp, каждый с одним или нулевым значением, что позволяет каждой строке быть в трех группах:
In [20]: v3
Out[20]:
name value grp1 grp2 grp3
0 a 34 x
1 b 98 x y
2 c 8 y
3 d 3 z
Другие реализации также были бы хороши, но я хотел бы привести несколько возможных примеров.
Например, я хочу представить, что существует функция MULTIgroupby, которая группирует столбец через запятую и допускает одинстрока должна быть в нескольких группах:
v1.MULTIgroupby('grp').count()
, чтобы дать:
grp count
x 2
y 2
z 1
Таким образом, даже если есть только 4 строки, количество добавляется до 5. Это правильно, ичто я хочу. count () это только один пример. Я хочу быть в состоянии сделать среднее, и медиана, и эфирные группы по агг функции.
Если это означает, что мне нужно заново их реализовать вручную, то пусть будет так. но я бы предпочел, если бы в этом не было необходимости ...
ETA: Добавление более сложных примеров:
Добавление столбца дополнительного значения:
In [27]: v1
Out[27]:
name value grp value2
0 a 34 x 45
1 b 98 x, y 9
2 c 8 y 345
3 d 3 z 2
In [28]: v2
Out[28]:
name value x y z value2
0 a 34 1 0 0 45
1 b 98 1 1 0 9
2 c 8 0 1 0 345
3 d 3 0 0 1 2
In [29]: v3
Out[29]:
name value grp1 grp2 grp3 value2
0 a 34 x 45
1 b 98 x y 9
2 c 8 y 345
3 d 3 z 2
с помощью groupby, Iможно сделать:
v3.groupby('grp1').mean()
Я получу среднее значение для значения и значения2 по x, y и z.
value value2
grp1
x 66 27
y 8 345
z 3 2
Я хочу:
value value2
grp
x 66 27
y 53 177
z 3 2
И да, я могу рассчитать это сам с циклом по всем столбцам, которые мне нужны, а затем с циклом по всем столбцам grpв версии 2, например, и фильтрация, а затем запуск функции mean (). Но прелесть группового в том, что мне НЕ НУЖНО ... Я надеюсь избежать этого ...
Тот факт, что мне так трудно выразить это, вероятно, означает, что это достаточноредкий случай, когда не существует простого способа сделать это ...
Позвольте мне повторить (по крайней мере, я думаю, что где-то это сказал): я могу выяснить, как сделать это вручную. Это не вопрос. Вопрос «НУЖНО ли мне делать это вручную?»Я не делал, когда у grp было только одно в строке, я мог использовать групповку. Теперь мне нужно все делать вручную? Если ответом будет «да», то я продолжу, но я бы не стал тратить свое время на реализацию множественных вложенных циклов (у меня есть несколько столбцов значений, несколько столбцов GRP и несколько значений в GRP), если яне нужно ...
Я добавил 2 ответа ниже, на случай, если нет простого группового решения ...