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

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

将其加载到您的环境中。如果该textIdscore 组至少包含一个等于1.0、2.0 和3.0?在这里,所需操作的结果将排除 textIdname1,因为它的 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

【讨论】:

以上是关于如何根据列组上的多(其他列)条件选择数据框行?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据列组前缀替换列组的空白?

从其他数据框行和列位置找到相应的值

Pandas:仅当特定列中的值以开头时才选择数据框行

如何根据其他列中的条件从某个 ID 中选择所有值?

检查列中的值是不是存在于数据框行中的其他位置

如何重塑数据框并将重复列转换为数据框行?