Python numpy 数组(和 Pandas 索引)中不区分大小写的逻辑

Case insensitive logic in Python numpy arrays (and Pandas Index)

我有一个Pandas系列,s,拼接出来::

print(s)
A            {B, A}
B     {B,  A   , E}
C          {B,  C}
D            {D, A}
E        {B, E,  C}
dtype: object

f = s.index
p = s.values

f 现在是一个 Pandas 索引; p 是一个 numpy 数组。然后我去掉空格。

我现在想'cross-check',看看每一行和每一列都有哪些字母::

cross_check = (p[:, None] & [{x} for x in f]).astype(bool)
print(cross_check)

array([[ True,  True, False, False, False],
       [ True,  True, False, False,  True],
       [False,  True,  True, False, False],
       [ True, False, False,  True, False],
       [False,  True,  True, False,  True]], dtype=bool)

这很好,但如果大小写不匹配就会失败,即第一行中的 "B" 是 'b'。

如何执行逻辑并不区分大小写??谢谢!!

您可以使用列表理解将 sets 转换为 upperstrip:

s = pd.Series([set(['B','A']), 
               set(['B', ' a   ', 'E']),
               set(['B','  C']),    
               set(['d','A']),
               set(['B','E', '  c'])], index=list('aBCDE'))
print (s)
a           {B, A}
B    {B, E,  a   }
C         {  C, B}
D           {d, A}
E      {  c, B, E}

f = s.index.str.upper().str.strip()
p = np.array([set([x.upper().strip() for x in item]) for item in s.values])
print (p)
[{'B', 'A'} {'B', 'E', 'A'} {'B', 'C'} {'D', 'A'} {'B', 'E', 'C'}]

cross_check = (p[:, None] & [{x} for x in f]).astype(bool)
print (cross_check)

[[ True  True False False False]
 [ True  True False False  True]
 [False  True  True False False]
 [ True False False  True False]
 [False  True  True False  True]]

对我来说 解决方案也很好用:

p = s.apply(lambda x: {v.strip().upper() for v in x})
print (p)
A       {B, A}
B    {B, E, A}
C       {B, C}
D       {D, A}
E    {B, E, C}
dtype: object