【问题标题】:Intersection of a dataframe with a list of columns数据框与列列表的交集
【发布时间】:2021-05-09 06:42:07
【问题描述】:

在执行查询之前,我需要将数据框列与数据库列(在列表中定义)相交。 我当前的代码如下所示:

db_columns_list = ['col1', 'col2', 'col3']
dataframe = dataframe[dataframe.columns & db_columns_list]

这很好用,但我收到了警告:

*FutureWarning: Index.__and__ operating as a set operation is deprecated, in the future this will be a logical operation matching Series.__and__.  Use index.intersection(other) instead
  dataframe = dataframe[dataframe.columns & db_columns_list]*

所以我想把它转换成类似的东西:

dataframe = dataframe[dataframe.columns.intersection(db_columns_list)]

但是我得到了错误:

*Unresolved attribute reference 'intersection' for class 'Iterator'* 

请注意,数据库可能包含比数据框更多的列。 因此,我相信交叉路口是解决此问题的正确方法。 谢谢

【问题讨论】:

    标签: python pandas list dataframe intersection


    【解决方案1】:

    intersection函数可以如下应用。

    玩具示例,

    db_columns_list = ['col1', 'col2', 'col3']
    df=DataFrame({
        'col1':[1,2],
        'col3':[3,4]
    })
    
    ## Solution
    df[set(df.columns).intersection(set(db_columns_list))]
    
    # Improved version with the help of `Mustafa Aydın` 
    df[df.columns.intersection(db_columns_list)]
    

    输出

        col3    col1
    0   3       1
    1   4       2
    

    【讨论】:

    • pd.Index 具有交集方法,无需转换为 set 即可工作。您的示例在没有 sets 的情况下有效。我认为问题不同
    • pd.Index 具有集合的所有功能以及更多功能,例如 - 它是有序的,它也可以包含重复项。所以,我想问题是差异。正如@MustafaAydın所建议的那样
    • 建议的新解决方案:df[df.columns.intersection(db_columns_list)] 对我不起作用。我得到:类“迭代器”的未解析属性引用“交集”。上一个有设置的工作。
    • @Forna 暂时添加了这两种解决方案,您使用的是哪个版本的 pandas?
    • nw,感谢 +1,我们在这里互相帮助。如果有人投反对票(他的选择)也没关系。
    【解决方案2】:

    希望下面的代码能解决您的问题。Intersection 仅适用于集合

    common_cols = list(set(dataframe.columns).intersection(set(db_columns_list)))
    
    dataframe = dataframe[common_cols]
    

    【讨论】:

    • 可能不需要转换为列表。
    猜你喜欢
    • 2022-07-06
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    • 2021-05-16
    相关资源
    最近更新 更多