Панды подсчитывают количество значений True/False в одном столбце для уникального набора/группировки другого столбца

Я пытаюсь подсчитать и составить список уникальных значений в столбце на основе значений другого столбца, если количество уникальных значений больше 2. Я ссылался на этот пост, который частично меня туда привел, но мне нужно понять, как фильтровать UniqueNum дальше. (Ссылка: Как подсчитать уникальные значения в одном столбце на основе значения в другом столбце по группе в Pandas)

key_id = {1008,1051,1003,1005,1072,1079,1092,1093,1004,2000}

(filtData.loc[(filtData['colC'] > 0) & (filtData['colB'].isin(key_id)),'colB']
    .groupby(filtData['colA'])
    .agg(UniqueNum='nunique')
    .reset_index())
# Above .loc might need additional booleans to include only uniqueNum greater than 2

Текущий вход:

           colA  colB       colC
0        1105904         1007   867.000000
1        1105904         1008    93.330002
2        1105904         2000     0.420000
3        1105904         1004     0.000000
4        1105904         1005     4.000000
5        1105905         1008     4.000000
6        1105905         1001     0.000000
7        1105905         1004     0.000000
8        1105905         1005     1.500000
9        1105905         1072     4.000000
10       1105905         1093     0.250000
11       1111111         1001     0.350000
12       1111111         1002     0.100000
13       1111111         1003     0.000000
14       1111111         1004     0.250000
15       1111111         1093     0.250000

Желаемый результат:

    colA    UniqueNum
0   1105904 3
1   1105905 4

# colA value 1111111 should not show up because the unique number count is not greater than 2. 

Как только желаемый результат будет достигнут, мы хотим поместить уникальные значения из colA в набор. Затем создайте CSV с отфильтрованными значениями, включающими colA, colB, colC, где критерии: значения colB должны быть найдены в key_id, значения colC больше 0, а количество значений colB, включенных в key_id, связанных со значениями colC, больше Значение больше 0 имеет счетчик больше 2. Я полагаю, что это может быть модификация агрегации. Кстати, я новичок в Pandas и изучаю более сложную логическую индексацию. Помощь в этом будет принята с благодарностью!

Можете ли вы предоставить минимальный воспроизводимый пример входных данных? (со всеми необходимыми столбцами) и соответствующий ожидаемый результат?

mozway 04.04.2024 18:42

@mozway, я обновил свой исходный пост, включив в него пример ввода. Возможно, для этого упражнения gt(0) можно пока установить на gt(2).

Screamcheese 04.04.2024 18:49

Спасибо, но, пожалуйста, вместо полного набора данных с ... создайте небольшой, но содержательный пример и предоставьте соответствующий ожидаемый результат. Вы можете увидеть связанный вопрос как пример хорошего MRE (максимум 10-20 строк, недвусмысленный, демонстрирующий крайние случаи).

mozway 04.04.2024 18:54

Как вы включаете colB в свои результаты? Структура вывода вашей группы не делает это возможным? Если вы не имеете в виду list?

ifly6 04.04.2024 19:14

@mozway и ifly6, посмотрите, поможет ли мой пример прояснить ситуацию. Я также обновил свою конечную цель, если это изменит подход.

Screamcheese 04.04.2024 20:34
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Ваша логика верна, проще всего отфильтровать строки после агрегации, например, с помощью запроса :

key_id = {1008,1051,1003,1005,1072,1079,1092,1093,1004,2000}

(filtData.loc[(filtData['colC'] > 0) & (filtData['colB'].isin(key_id)),'colB']
    .groupby(filtData['colA'])
    .agg(UniqueNum='nunique')
    .reset_index()
    .query('UniqueNum > 2')
)

Или лок :

key_id = {1008,1051,1003,1005,1072,1079,1092,1093,1004,2000}

(filtData.loc[(filtData['colC'] > 0) & (filtData['colB'].isin(key_id)),'colB']
    .groupby(filtData['colA'])
    .agg(UniqueNum='nunique')
    .reset_index()
    .loc[lambda x: x['UniqueNum'] > 2]
)

Выход:

      colA  UniqueNum
0  1105904          3
1  1105905          4

mozway, возможно, я преждевременно отметил проблему как решенную. (filtData['colC'] > 0) & (filtData['colB'].isin(key_id)) кажется независимыми друг от друга. Есть ли способ включить два сравнения в одну и ту же оценку строки?

Screamcheese 06.04.2024 04:22

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