将以下数据框复制到剪贴板:
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
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
。df[df.textId.isin(textIdThatMatchScore123)]
失败。答案 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