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'。
如何执行逻辑并不区分大小写??谢谢!!
您可以使用列表理解将 set
s 转换为 upper
和 strip
:
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
我有一个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'。
如何执行逻辑并不区分大小写??谢谢!!
您可以使用列表理解将 set
s 转换为 upper
和 strip
:
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