【发布时间】:2023-03-08 20:09:01
【问题描述】:
我有一个从 txt 文件加载的列表,并运行了一些代码来匹配数据。但是我得到了TypeError: Unhashable list 我在 Stack 上查看了几个答案,但找不到将列表传递到循环中的位置。我猜它与 df 有关,因为它在我不使用加载的数据时起作用。
import pandas as pd
import re
#Capture tester
df = pd.read_csv('patterntest.txt', header=None, dtype=str)
df.columns = ['names']
df['status']=''
patterns=['(?i)(C|F|L)at', 'Dog']
for i in xrange(len(patterns)):
df.loc[df.names.str.match(patterns[i]),'status'] = 'CAPTURED'
print df
我也看不到将列表传递到for 循环的位置。
'patterntest.txt' 里面的所有文件都只是一些文本,例如:
dog
cat
mouse
frog
fox
canis sp
这是我的意见
import pandas as pd
import re
#Capture tester
df = pd.read_csv('patterntest.txt', header=None, dtype=str)
df.columns = ['names']
df['status']=''
patterns=['(?i)(C|H|L)at', 'Dog']
##
##for i in xrange(len(patterns)):
## df.loc[df.names.str.match(patterns[i]),'status'] = 'CAPTURED'
print df.names.str.match(patterns[0])
print df.names.str.match(patterns[1])
输出:
>>>
C:\Python27\lib\site-packages\pandas\core\strings.py:350: UserWarning: In future versions of pandas, match will change to always return a bool indexer.
" always return a bool indexer.""", UserWarning)
0 []
1 (C,)
2 []
3 []
4 []
5 []
Name: names, dtype: object
0 True
1 False
2 False
3 False
4 False
5 False
Name: names, dtype: bool
我测试了这两种模式,看看它是否是正则表达式,看起来可能是。
更新:确认这是一个正则表达式问题,改成正则表达式,它工作正常。
df = pd.read_csv('patterntest.txt', header=None, dtype=str)
df.columns = ['names']
df['status']=''
patterns=['Cat', 'Dog']
for i in xrange(len(patterns)):
df.loc[df.names.str.match(patterns[i]),'status'] = 'CAPTURED'
那么有没有办法解决这个问题?
【问题讨论】:
-
df.names.str.match(patterns[i])返回什么? -
@NPE 如果我将模式手动放入其中,则会返回一堆 []。如果我输入
pattern[1],它会返回一个布尔值。 -
@NPE 我认为这与数据帧的格式有关,因为
df.names.str.match(patterns[1])返回一个True/False值的数组。但是当你把它放入df[df.names.str.match(patterns[1])]时,你会得到括号[] -
你能举一个小例子来证明这一点吗?
-
@AndyHayden 是的,我会的