大熊猫。检查行是否部分等于

时间:2017-04-20 09:21:01

标签: python pandas

我有桌子:

      tel size                       1              2      3     4
0    123    1                    Baby           Baby   None  None   
1    234    1                   Shave          Shave   None  None   
2    222    1                    Baby           Baby   None  None   
3    333    1                   Shave          Shave   None  None

我想检查表1,2,3,4中的值是否与2个循环部分相等:

x = df_map.iloc[i,2:]
y = df_map.iloc[j,2:]

所以df_map.iloc [0,2:]应该等于df_map.iloc [2,2:], 和df_map.iloc [1,2:]等于df_map.iloc [3,2:],

我试过了:

x == y

y.eq(x)

但它返回错误:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

如果我使用(x == y).all()或(x == y).any(),则返回错误的结果。

我需要类似的东西:

if x== y:
    counter += 1

更新

问题是无值。我使用了fillna('')和(x == y).all()

2 个答案:

答案 0 :(得分:2)

  • fillna('')因为None == NoneFalse
  • 使用numpy广播评估==
  • all(-1)以确保整行符合
  • np.fill_diagonal因为我们不需要自我匹配
  • np.where找到匹配的位置
v = df.fillna('').values[:, 2:]

match = ((v[None, :] == v[:, None]).all(-1))

np.fill_diagonal(match, False)
i, j = np.where(match)

pd.Series(i, j)

2    0
3    1
0    2
1    3
dtype: int64

答案 1 :(得分:0)

pandas系列(行,列)的类型是numpy数组,你只能按列到列获得结果,除非你从结果中再次循环,这也是另一个数组

import numpy as np 
x = df_map[i,2:]
y = df_map[j,2:]

np.equal(y.values,x.values)