我在以下代码中遇到此错误
def cleaning(CURRENT,STRING,NEXT):
data.ix[data[NEXT].str.contains(STRING,na=False),CURRENT] =...
data[NEXT][data[NEXT].str.contains(STRING,na=False)]
d = ['lower','Less']
c = a[5:]
for x,y in zip(range(len(c)),d):
cleaning(c[x],d,c[x+1])
cleaning(c[x],d,c[x+2])
在这里,数据是一个熊猫DataFrame。但是对于相同的功能,我在以下代码中没有错误
a = ['UBC','LBC', 'HC', 'FC', 'P:C/F','P', 'A', 'Sex']
b = ['upper','lower','hair','footwear']
for x,y in zip(range(len(a)),b):
cleaning(a[x],y,a[x+1])
cleaning(a[x],y,a[x+2])
我知道这是因为我们不能将列表用作字典中的键,但是我不确定这里是如何发生的,以及为什么它在一个循环而不是另一个循环中起作用。
您传入d
一个列表作为STRING
参数:
d = ['lower','Less']
# ...
cleaning(c[x],d,c[x+1])
# ^
您的第二个示例有效,您传入了y
,它是b
列表中的单个元素:
b = ['upper','lower','hair','footwear']
for x,y in zip(range(len(a)),b):
# ^ one element from b ^
cleaning(a[x],y,a[x+1])
# ^
该pandas.Series.str.contains
方法默认情况下接受正则表达式,并re.compile
使用字典作为缓存来保存编译后的模式。因为您传递了一个列表,所以会出现错误:
>>> pandas.Series(['aa', 'bb', 'cc']).str.contains(['a'])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/mjpieters/Development/venvs/stackoverflow-2.7/lib/python2.7/site-packages/pandas/core/strings.py", line 1458, in contains
regex=regex)
File "/Users/mjpieters/Development/venvs/stackoverflow-2.7/lib/python2.7/site-packages/pandas/core/strings.py", line 222, in str_contains
regex = re.compile(pat, flags=flags)
File "/Users/mjpieters/Development/venvs/stackoverflow-2.7/lib/python2.7/re.py", line 194, in compile
return _compile(pattern, flags)
File "/Users/mjpieters/Development/venvs/stackoverflow-2.7/lib/python2.7/re.py", line 237, in _compile
p, loc = _cache[cachekey]
TypeError: unhashable type: 'list'
解决方法是传递y
而不是d
:
for x, y in zip(range(len(c)) ,d):
cleaning(c[x], y, c[x + 1])
cleaning(c[x], y, c[x + 2])
您可能想提出更好的变量名。一个字母的名称很难区分,并且容易导致此类错误。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句