如何根据列组上的多(其他列)条件选择数据框行?
Posted
技术标签:
【中文标题】如何根据列组上的多(其他列)条件选择数据框行?【英文标题】:How to select dataframe rows according to multi-(other column)-condition on columnar groups? 【发布时间】:2016-08-04 23:17:16 【问题描述】:将以下数据框复制到剪贴板:
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
的score
组至少包含一个等于1.0、2.0 和3.0?在这里,所需操作的结果将排除 textId
行 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,然后只保留 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
【讨论】:
以上是关于如何根据列组上的多(其他列)条件选择数据框行?的主要内容,如果未能解决你的问题,请参考以下文章