【问题标题】:Dataframe filtering rows by column values数据框按列值过滤行
【发布时间】:2017-11-12 21:44:52
【问题描述】:

我有一个数据框df

       Num1   Num2 
one       1      0
two       3      2
three     5      4
four      7      6
five      9      8

我想过滤 Num1 中值大于 3 而 Num2 中值小于 8 的行。

我试过了

df = df[df['Num1'] > 3 and df['Num2'] < 8]

但发生了错误。

ValueError: Series 的真值不明确。

所以我用了

df = df[df['Num1'] > 3]
df = df[df['Num2'] < 8]

我认为代码可以更短。

还有其他方法吗?

【问题讨论】:

    标签: python pandas dataframe filter


    【解决方案1】:

    是的,您可以使用&amp; 运算符:

    df = df[(df['Num1'] > 3) & (df['Num2'] < 8)]
    #                        ^ & operator

    这是因为and 作用于两个操作数的真实性值,而&amp; 运算符可以定义在任意数据结构上。

    括号在这里是强制性的,因为&amp; 绑定比&gt;&lt; 短,所以没有括号,Python 会将表达式读取为df['Num1'] &gt; (3 &amp; df['Num2']) &lt; 8

    请注意,您可以将| 运算符用作逻辑或。

    【讨论】:

      【解决方案2】:

      您需要添加(),因为运算符优先于按位运算符&amp;

      df1 = df[(df['Num1'] > 3) & (df['Num2'] < 8)]
      print (df1)
             Num1  Num2
      three     5     4
      four      7     6
      

      更好的解释是here

      或者如果需要最短代码使用query:

      df1 = df.query("Num1 > 3 and Num2 < 8")
      print (df1)
             Num1  Num2
      three     5     4
      four      7     6
      

      df1 = df.query("Num1 > 3 &  Num2 < 8")
      print (df1)
             Num1  Num2
      three     5     4
      four      7     6
      

      【讨论】:

      • 如果我们想要更少的字符,我们可以使用像df.Num 这样的列名(假设名称是一个有效的python变量名,例如字母数字,以字母开头,允许下划线) ,也是!
      • 不知道df.query!谢谢!
      • 请注意,如果列有任何特殊字符,df.query 似乎不起作用。据我所知,它不起作用,例如,dash-case 样式的列。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-13
      • 2019-03-07
      • 2021-12-17
      • 2011-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多