【问题标题】:python pandas select rows where two columns are (not) equalpython pandas选择两列(不)相等的行
【发布时间】:2017-07-11 16:24:47
【问题描述】:
hsp.loc[hsp['Len_old'] == hsp['Len_new']]

我试试这段代码,它工作正常。

但是这三个我都试过了

hsp.loc[hsp['Type_old'] == hsp['Type_new']] 
hsp.loc[hsp['Type_old'] != hsp['Type_new']] 
hsp.loc[hsp['Len_old'] != hsp['Len_new']] 

他们不工作。

我的数据表hsp是这样的

id  Type_old  Type_new  Len_old  Len_new
1    Num       Num       15       15
2    Num       Char      12       12
3    Char      Num       10       8
4    Num       Num       4        5
5    Char      Char      9        10

有没有更好的方法来选择两列不相等的行。

【问题讨论】:

  • “不工作”是什么意思?什么是预期的输出?实际输出是多少?我运行了你提到的命令,它们正在运行,我希望它们能正常运行。
  • 它在我这边工作
  • 如果您觉得我的答案有用,请随时为我的答案投票。

标签: python pandas


【解决方案1】:

使用complement operator~

hsp.loc[~(hsp['Type_old'] == hsp['Type_new'])]

给出:

   id Type_old Type_new  Len_old  Len_new
1   2      Num     Char       12       12
2   3     Char      Num       10        8

在处理布尔运算时,补码运算符是一种将TrueFalse 反转的便捷方法

【讨论】:

    【解决方案2】:

    在比较 pd.Series 时,==!= 的混淆方式

    如预期的那样

    df[['Len_old', 'Len_new']].assign(NE=df.Len_old != df.Len_new)
    
       Len_old  Len_new     NE
    0       15       15  False
    1       12       12  False
    2       10        8   True
    3        4        5   True
    4        9       10   True
    

    但如果列的值之一是字符串!

    df[['Len_old', 'Len_new']].assign(NE=df.Len_old.astype(str) != df.Len_new)
    
       Len_old  Len_new    NE
    0       15       15  True
    1       12       12  True
    2       10        8  True
    3        4        5  True
    4        9       10  True
    

    确保两者是相同的类型。

    【讨论】:

      【解决方案3】:

      正如piRSquared 所说,您的代码存在类型问题。

      除此之外,您还可以使用比较方法,在本例中为 pd.Series.ne

      使用您的数据:

      hsp.loc[hsp['Type_old'].ne(hsp['Type_new'])]
      

      但是,正如 piRSquared 所提到的,由于 dtypes 它不起作用。 以防万一,您必须注意数据中的 NaN/None 值...例如:

      hsp.loc[ ( hsp['Type_old'].ne(hsp['Type_new']) ) && (hsp['Type_old'].notna())]
      

      在这种情况下,.ne 有另一个参数 fill_value,用于填充缺失的数据。


      此外,您可以使用“比较”方法来显示两个系列(或 DataFrames)之间的差异

      hsp.Len_old.compare(hsp.Len_new)
      

      并且它可能会返回(如果列具有相同的 dtype):

         self  other
      2  10.0    8.0
      3   4.0    5.0
      4   9.0   10.0
      

      但只是强制拥有另一个 dtype:

      hsp.Len_old.compare(hsp.Len_new.astype('str')) # string type new column
      

      它将返回所有行:

         self other
      0   15  15
      1   12  12
      2   10  8
      3   4   5
      4   9   10
      

      【讨论】:

      • 熊猫版本:1.2.2
      猜你喜欢
      • 2015-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-16
      • 1970-01-01
      • 1970-01-01
      • 2015-10-17
      相关资源
      最近更新 更多