Как выбрать строки данных в соответствии с multi- (другим столбцом) - условие для столбчатых групп?

Скопируйте следующий файл данных в буфер обмена:

  textId   score              textInfo
0  name1     1.0            text_stuff
1  name1     2.0  different_text_stuff
2  name1     2.0            text_stuff
3  name2     1.0  different_text_stuff
4  name2     1.3  different_text_stuff
5  name2     2.0  still_different_text
6  name2     1.0              yoko ono
7  name2     3.0     I lika da Gweneth
8  name3     1.0     Always a tradeoff
9  name3     3.0                What?!

Теперь используйте

import pandas as pd
df=pd.read_clipboard(sep='\s\s+')

чтобы загрузить его в вашу среду. Как разрезать этот блок данных таким образом, чтобы строки all были возвращены в строки textId, если группа score этого textId включает в себя хотя бы один score, который равен 1.0, 2.0 и 3,0? Здесь желаемый результат операции исключает textId rows name1, так как в его группе score отсутствует значение 3.0 и исключение name3, так как в его группе score отсутствует значение 2.0:

  textId   score              textInfo
0  name2     1.0  different_text_stuff
1  name2     1.3  different_text_stuff
2  name2     2.0  still_different_text
3  name2     1.0              yoko ono
4  name2     3.0     I lika da Gweneth

Попытки

  • df[df.textId == "textIdRowName" & df.score == 1.0 & df.score == 2.0 & & df.score == 3.0] неверно, так как условие не действует в группе textId, но только отдельные строки. Если это может быть переписанный для сопоставления с группами textId, тогда он может быть помещен в цикле for и подали уникальное имя textIdRowName. Такая функция собирал имена textId в серии (скажем, textIdThatMatchScore123), который затем можно было бы использовать для нарезки оригинала df как df[df.textId.isin(textIdThatMatchScore123)].
  • Ошибка groupby.

Ответы

Ответ 1

Здесь одно решение - groupby textId, а затем сохраняйте только те группы, где уникальные значения оценки - это супермножество (>=) [1.0, 2.0, 3.0].

In [58]: df.groupby('textId').filter(lambda x: set(x['score']) >= set([1.,2.,3.]))
Out[58]: 
  textId  score              textInfo
3  name2    1.0  different_text_stuff
4  name2    1.3  different_text_stuff
5  name2    2.0  still_different_text
6  name2    1.0              yoko ono
7  name2    3.0     I lika da Gweneth