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

Python numpy数组(和索引)中不区分大小写的逻辑,python,pandas,numpy,boolean-logic,case-sensitive,Python,Pandas,Numpy,Boolean Logic,Case Sensitive,我有一个熊猫系列,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现在是一个指数;p是一个numpy数组。然后我去掉空白 我现在想“交叉检查”,看看每行和每列中有哪些字母: cross_check = (p[:, None] &a

我有一个熊猫系列,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现在是一个指数;p是一个numpy数组。然后我去掉空白

我现在想“交叉检查”,看看每行和每列中有哪些字母:

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”,则会失败


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

您可以使用列表理解功能将
设置
s转换为
上部
,使用
条带

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

不!!很好。改变了,现在应该很好了;返回布尔数组中的所有false。Strip缺少try
(s.apply(lambda x:{v.Strip().upper(),表示x中的v})。s.index中的x的值[:,None]&[{x}])。astype(bool)
Hmmm,仍然提供完整的false数组…好吧,这可能有效,并且确实解决了区分大小写的问题。但是它实际上不是很通用,也没有解决上面给出的特定实例。所以,我们在这里进行了测试。因此,从技术上讲,上面的答案,加上“v.strip().upper()”适用于本例。但是,如果您将第一个“A”改为小写“A”(即修改s.index),则strip().upper()不起作用。我想我是在执行布尔逻辑运算,其中“A”和“A”的计算结果为TRUE(而不是操纵字符串)。解决方案是将索引的值转换为大写,如果需要,还可以使用strip。解决方案正在修改。当然,但问题是关于不区分大小写的逻辑。