Я пытаюсь подсчитать и составить список уникальных значений в столбце на основе значений другого столбца, если количество уникальных значений больше 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, я обновил свой исходный пост, включив в него пример ввода. Возможно, для этого упражнения gt(0)
можно пока установить на gt(2)
.
Спасибо, но, пожалуйста, вместо полного набора данных с ...
создайте небольшой, но содержательный пример и предоставьте соответствующий ожидаемый результат. Вы можете увидеть связанный вопрос как пример хорошего MRE (максимум 10-20 строк, недвусмысленный, демонстрирующий крайние случаи).
Как вы включаете colB в свои результаты? Структура вывода вашей группы не делает это возможным? Если вы не имеете в виду list
?
@mozway и ifly6, посмотрите, поможет ли мой пример прояснить ситуацию. Я также обновил свою конечную цель, если это изменит подход.
Ваша логика верна, проще всего отфильтровать строки после агрегации, например, с помощью запроса :
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))
кажется независимыми друг от друга. Есть ли способ включить два сравнения в одну и ту же оценку строки?
Можете ли вы предоставить минимальный воспроизводимый пример входных данных? (со всеми необходимыми столбцами) и соответствующий ожидаемый результат?