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

  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+')

将其加载到您的环境中。如果该数据帧的textId组包含至少一个等于1.0、2.0和3.0的score,如何对该数据帧进行切片,以使全部的行返回特定textId的行?在这里,所需操作的结果将排除score行name1,因为其textId组缺少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

尝试次数
  • score不正确,因为条件不起作用
    df[df.textId == "textIdRowName" & df.score == 1.0 & df.score == 2.0& & df.score == 3.0]组上,但仅单个行。如果这可能是
    重写以匹配textId组,然后可以将其放置
    在for循环中,并输入了唯一的textIdRowName。这样的功能
    会收集一系列textId的名称(例如textId),然后可以将其用于切片原始df
    textIdThatMatchScore123一样。
  • 出现df[df.textId.isin(textIdThatMatchScore123)]失败。
  • 最佳答案

    这是一个解决方案-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
    

    关于python - 如何根据列组的多(其他列)条件选择数据框行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36605535/

    10-11 05:13