Как получить имя, если в пандах указан номер рулона - PullRequest
0 голосов
/ 05 сентября 2018

Мой код:

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

Итак, как мне получить ожидаемый вывод для моего кода?

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Я полагаю, что исключение выдается в этой строке:

if a in df['Roll No']:

'a' - это список (изменяемый тип), и ключи должны быть неизменяемыми.

Вместо этого вы можете сделать выбор, используя метод 'isin':

names = df['Name'][df['Roll No'].isin(a)]
print(names)
0 голосов
/ 05 сентября 2018

Используйте boolean indexing с преобразованием значений в строки по astype и выбором первых 8 значений valeus путем индексации:

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
...