python pandas选择两列(非)相等的行。

时间:2017-07-11 16:24:48

标签: python pandas

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

是否有更好的方法来选择两列不是排队的行。

3 个答案:

答案 0 :(得分:6)

使用补充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

在处理布尔运算时,补码运算符是用True

反转False的便捷方式

答案 1 :(得分:3)

比较==

时,!=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

确保两者的类型相同。

答案 2 :(得分:1)

正如 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)

它可能会返回(如果列的数据类型相同):

   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