我的代码是:
df=pd.read_excel('vip.xlsx')
df
b=df['Roll No']
a=[x for x in map(str,b) if x[:8] == '12153162']
d=df['Name']
c=[y for y in map(str,d)]
if a in df['Roll No']:
print(df['Name'])
我为此输入错误:
TypeError: unhashable type: 'list'
例如,我的数据框是:
Name Roll No
Rahil 1215316235
Meher 1210316934
Sreejan 1215316235
Aditya 1215316952
Ajith 1215316002
对于此数据框,我上面的代码的预期输出为:
Rahil
Sreejan
那么我如何获得代码的预期输出?
答案 0 :(得分:1)
使用boolean indexing
,将astype
的值转换为字符串,并通过索引选择前8个值:
s = df.loc[df['Roll No'].astype(str).str[:8] == '12153162', 'Name']
print (s)
0 Rahil
2 Sreejan
Name: Name, dtype: object
df1 = df[df['Roll No'].astype(str).str[:8] == '12153162']
print (df1)
Name Roll No
0 Rahil 1215316235
2 Sreejan 1215316235
如果要使用列表推导进行过滤:
s = df.loc[[str(x)[:8] == '12153162' for x in df['Roll No']], 'Name']
print (s)
0 Rahil
2 Sreejan
Name: Name, dtype: object
答案 1 :(得分:0)
我相信此行会引发异常:
if a in df['Roll No']:
'a'是一个列表(可变类型),键必须是不可变的。
相反,您可以使用'isin'方法进行选择:
names = df['Name'][df['Roll No'].isin(a)]
print(names)