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

时间:2016-04-13 17:28:47

标签: python pandas group-by conditional

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

  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}}组包含至少一个score,那么如何对此数据框进行切片,以便全部返回特定textId的行那等于1.0,2.0和3.0?此处,所需操作的结果将排除score name1 ,因为其textId组缺少3.0并排除 name3 ,因为其score组缺少2.0:

score

尝试

    由于条件不起作用,
  1. 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组,然后可以放置它 在for循环中并提供唯一的 textIdRowName 。这样的功能 会收集一系列textId的名字(比方说 textId)然后可用于切片原始df 比如textIdThatMatchScore123
  2. df[df.textId.isin(textIdThatMatchScore123)]失败。

1 个答案:

答案 0 :(得分:2)

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