【问题标题】:Pandas DataFrame : selection of multiple elements in several columnsPandas DataFrame:在几列中选择多个元素
【发布时间】:2018-11-22 13:27:10
【问题描述】:

我有这个 Python Pandas DataFrame DF

DICT = {  'letter': ['A','B','C','A','B','C','A','B','C'],
          'number': [1,1,1,2,2,2,3,3,3],
          'word'  : ['one','two','three','three','two','one','two','one','three']}

DF = pd.DataFrame(DICT)

看起来像:

  letter  number   word
0      A       1    one
1      B       1    two
2      C       1  three
3      A       2  three
4      B       2    two
5      C       2    one
6      A       3    two
7      B       3    one
8      C       3  three

我想提取线条

  letter  number   word
       A       1    one
       B       2    two
       C       3  three

首先我累了:

DF[(DF['letter'].isin(("A","B","C"))) & 
    DF['number'].isin((1,2,3))        &
    DF['word'].isin(('one','two','three'))]

当然没用,都选好了

然后我测试了:

Bool = DF[['letter','number','word']].isin(("A",1,"one"))
DF[np.all(Bool,axis=1)]

很好,它有效!但仅适用于一条线... 如果我们采取下一步并给.isin()一个迭代:

Bool = DF[['letter','number','word']].isin((("A",1,"one"),
                                            ("B",2,"two"),
                                            ("C",3,"three")))

然后就失败了,布尔数组全是False……

我做错了什么?有没有更优雅的方法来根据几列进行此选择?

(无论如何,我想避免 for 循环,因为我使用的真实 DataFrame 非常大,所以我正在寻找最快的最佳方式来完成这项工作)

【问题讨论】:

    标签: python pandas dataframe multiple-columns selection


    【解决方案1】:

    想法是使用所有三元组值创建新的DataFrame,然后使用原始DataFrame 创建merge

    L = [("A",1,"one"),
         ("B",2,"two"),
         ("C",3,"three")]
    
    df1 = pd.DataFrame(L, columns=['letter','number','word'])
    print (df1)
      letter  number   word
    0      A       1    one
    1      B       2    two
    2      C       3  three
    
    df = DF.merge(df1)
    print (df)
      letter  number   word
    0      A       1    one
    1      B       2    two
    2      C       3  three
    

    另一个想法是创建元组列表,转换为Series,然后通过isin进行比较:

    s = pd.Series(list(map(tuple, DF[['letter','number','word']].values.tolist())),index=DF.index)
    df1 = DF[s.isin(L)]
    print (df1)
      letter  number   word
    0      A       1    one
    4      B       2    two
    8      C       3  three
    

    【讨论】:

    • 转换为元组的替代解决方案有效......但它不是很直观,对于这个常见问题的更好解决方案应该由 pandas 的开发人员实施;)
    猜你喜欢
    • 2017-05-06
    • 1970-01-01
    • 2017-11-19
    • 2020-05-21
    • 2012-08-08
    • 1970-01-01
    • 2014-01-01
    • 1970-01-01
    相关资源
    最近更新 更多