将以下数据框复制到剪贴板:
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
返回那一组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
.
最佳答案
这里有一个解决方案 - 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
关于python - 如何根据柱状组的多(其他列)条件选择数据框行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36605535/