如何根据列组上的多(其他列)条件选择数据框行?

zel*_*usp 7 python conditional group-by pandas

将以下数据框复制到剪贴板:

  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?!
Run Code Online (Sandbox Code Playgroud)

现在使用

import pandas as pd
df=pd.read_clipboard(sep='\s\s+')
Run Code Online (Sandbox Code Playgroud)

将其加载到您的环境中。如果该组包含至少一个等于 1.0、2.0 和 3.0 的数据帧,如何对该数据帧进行切片,以便返回特定的所有行?此处,所需操作的结果将排除行name1,因为其组缺少 3.0 并排除name3,因为其组缺少 2.0:textIdscoretextIdscoretextIdscorescore

  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
Run Code Online (Sandbox Code Playgroud)

尝试

  1. 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)]
  2. 失败于groupby

chr*_*isb 4

这是一种解决方案 - groupbytextId,然后仅保留 Score 的唯一值是 的超集 ( >=) 的那些组[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
Run Code Online (Sandbox Code Playgroud)