首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >numpy或大熊猫通过替代2循环的方式

numpy或大熊猫通过替代2循环的方式
EN

Stack Overflow用户
提问于 2020-08-05 09:07:48
回答 1查看 148关注 0票数 1

我有一个问题,这是主要课程的清单:

代码语言:javascript
复制
list_main_classes = [3,4]
data = pd.DataFrame({
    'label_col':[1,1,2,2,3,3,3,4,4], 
    'second_classes_column':[
        "class1", 
        "class2", 
        "class1", 
        "class2", 
        "class3", 
        "class3", 
        "class3", 
        "class4", 
        "class2"
    ]})

它有一个列"second_classes_column",基本上我要做的是从列表"list_main_classes"中删除一些满足特定条件的元素。什么条件?

不能命名"certain_name"

  • "second_classes_column"元素的
  1. 二等列不能出现在'label_col'创建的组之外。这意味着,对于由“label_col”的元素4创建的组,在"second_classes_column"中不能有出现在其他组中的元素。在我们的例子中,元素"class2"并不能满足这一点,因为它已经出现在前面(第2行和第4行)。因此,我们将删除4,但保留3从list_main_classes,因为它满足一切,

问题是否有更快的方法来做到这一点,Pandas,numpy,已经用2 for循环完成了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-05 09:53:56

您应该对数据执行合并,然后对结果数据进行筛选。

另外,如果"second_classes_column"有多个唯一的"label_col"分配给它,那么它是无效的,因此您可以预先计算与每个"second_classes_column"相关联的label_cols数量。

代码语言:javascript
复制
# setup some useful variables
main_classes = pd.DataFrame({"main_classes": list_main_classes})
count_unique_classes = data.groupby("second_classes_column")["label_col"].nunique().to_dict()

def your_logic(x):
    second_id = x["second_classes_column"]
    label_col = x["label_col"]
    
    case1 = second_id != "certain_class"
    case2 = count_unique_classes[second_id] > 1
    
    return case1 and case2

# merge the two data frames
joint_df = pd.merge(data, main_classes, left_on="label_col", right_on="main_classes")

# now you can easily do the filter and perform your logic
to_drop = joint_df.apply(your_logic, axis=1)
list_main_indexes_to_drop = joint_df[to_drop].main_classes

结果是:

代码语言:javascript
复制
>>> list_main_indexes_to_drop.values
... array([4])

可以使用filter、set操作或np.setdiff1d获得最终列表。

代码语言:javascript
复制
>>> list(set(list_main_classes) - set(list_main_indexes_to_drop))
... [3]

代码语言:javascript
复制
>>> np.setdiff1d(list_main_classes, list_main_indexes_to_drop)
... array([3])

更新.您可能不喜欢your_logicapply,因此可以使用向量化的布尔操作来完成它,如下所示:

代码语言:javascript
复制
# setup some useful variables
main_classes = pd.DataFrame({"main_classes": list_main_classes})
count_unique_classes = data.groupby("second_classes_column")["label_col"].nunique().ge(2)
invalid_classes = set(count_unique_classes[count_unique_classes].index)

# merge the two data frames
joint_df = pd.merge(data, main_classes, left_on="label_col", right_on="main_classes")

# your logic
joint_df = joint_df[
    (joint_df.second_classes_column != "certain_class") & 
    (joint_df.second_classes_column.isin(invalid_classes)) 
]

# now you can easily do the filter and perform your logic
list_main_indexes_to_drop = joint_df.main_classes
list_main_indexes_to_drop.values
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63261856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档