【问题标题】:Filtering pandas DataFrame by values in a list [duplicate]按列表中的值过滤pandas DataFrame [重复]
【发布时间】:2018-01-02 07:21:27
【问题描述】:

有一个熊猫数据框:

  df = pd.DataFrame({'c1':['a','b','c','d'],'c2':[1,2,3,4]})

c1  c2
0   a   1
1   b   2
2   c   3
3   d   4

还有一个熊猫系列:

list1 = pd.Series(['b','c','e','f'])

Out[6]:
0    a
1    b
2    c
3    e

如何创建一个包含 c1 在 list1 中的行的新数据框。

输出:

c1  c2
0   b   2
1   c   3 

【问题讨论】:

    标签: python pandas list dataframe


    【解决方案1】:

    你可以使用df.isin:

    In [582]: df[df.c1.isin(list1)]
    Out[582]: 
      c1  c2
    1  b   2
    2  c   3
    

    或者,使用df.loc,如果你想修改你的切片:

    In [584]: df.loc[df.c1.isin(list1), :]
    Out[584]: 
      c1  c2
    1  b   2
    2  c   3
    

    【讨论】:

      【解决方案2】:

      使用query

      In [1133]: df.query('c1 in @list1')
      Out[1133]:
        c1  c2
      1  b   2
      2  c   3
      

      或者,使用isin

      In [1134]: df[df.c1.isin(list1)]
      Out[1134]:
        c1  c2
      1  b   2
      2  c   3
      

      【讨论】:

        【解决方案3】:

        @JohnGalt 和 @COLDSPEED 的答案都更符合 pandas 的习惯。请不要使用这些答案。它们旨在有趣并说明pandas 和numpy api 的其他部分。

        替代 1
        这是利用numpy.in1d 作为pd.Series.isin 的代理

        df[np.in1d(df.c1.values, list1.values)]
        
          c1  c2
        1  b   2
        2  c   3
        

        替代 2
        使用set逻辑

        df[df.c1.apply(set) & set(list1)]
        
          c1  c2
        1  b   2
        2  c   3
        

        替代 3
        使用pd.Series.str.match

        df[df.c1.str.match('|'.join(list1))]
        
          c1  c2
        1  b   2
        2  c   3
        

        【讨论】:

        • 现在找到另一种方法变得非常具有挑战性...... ;)
        • 在那个熊猫人来垃圾你使用numpy之前最好+1 :^)
        • @cᴏʟᴅsᴘᴇᴇᴅ 我们很好(-:我对每个人都说得对。
        【解决方案4】:

        为了完整起见

        实现这一目标的另一种方式(绝对不是最好的方式):

        In [4]: df.merge(list1.to_frame(name='c1'))
        Out[4]:
          c1  c2
        0  b   2
        1  c   3
        

        【讨论】:

          猜你喜欢
          • 2015-12-13
          • 1970-01-01
          • 2018-01-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-05
          • 1970-01-01
          相关资源
          最近更新 更多