Как получить значение столбца на основе идентификатора, заданного из другой таблицы - PullRequest
0 голосов
/ 21 ноября 2018

Я хотел извлечь значение столбца, заданного для другого столбца с идентификаторами другого набора данных.

DF-1:

ID  A       B
1   cat     22
2   dog     33
3   mamal   44
4   rat     55
5   rabbit  66
6   puppy   77

DF-2:

name   fav_animal
  x   1,2,3
  y   2,3
  z   3,4 

Я хотел бы увидеть любимых животных х в новом списке, скажем name_animal.

код:

#storing all the id's of x frist
list_id = []
name_animal = []
for i in list_ids:
    name_animal.append(df1.loc[df1.id == i, 'A'].values.to_list()

Вывод:

list_id = [1,2,3]
name_animal = ['cat','dog','mamal']

Ответы [ 4 ]

0 голосов
/ 21 ноября 2018

Я думаю, что вы ищете это:

df1 = pd.DataFrame({'ID':np.arange(1, 7),
    'A': ['cat', 'dog', 'mamal', 'rat', 'rabbit', 'puppy'],
                  'B': [22, 33, 44, 55, 66, 77]})

df2 = pd.DataFrame({'name': ['x', 'y', 'z'],
                  'fav_animal': ['1,2,3', '2,3', '3,4']})

df2.loc[df2.name == 'x', 'fav_animal'].str.split(',')[0]
['1', '2', '3']

Возвращает список строк.Поэтому вам нужно преобразовать значения в целые числа с помощью функции карты.

mask = map(int, df2.loc[df2.name == 'x', 'fav_animal'].str.split(',')[0])

df1.loc[df1.ID.isin(mask), 'A'].values.tolist()
>['cat', 'dog', 'mamal']
0 голосов
/ 21 ноября 2018

Первая проверка найдет fav_animal значения с boolean indexing, next и iter для возврата пустого списка, если не найдено ни одного имени.

a = next(iter(df2.loc[df2['name'] == 'x', 'fav_animal']), [])

Затем разделить значенияи преобразовать их в целые числа:

list_id = list(map(int, a.split(',')))
print (list_id)
[1, 2, 3]

И последний фильтр по isin первый DataFrame:

name_animal = df1.loc[df1.ID.isin(list_id), 'A'].values.tolist()
print (name_animal)
['cat', 'dog', 'mamal']
0 голосов
/ 21 ноября 2018

Как то так?

for i in df2.fav_animal.tolist():
    print(df1.loc[map(int, i.split(","))]["A"].tolist())

Вывод:

['dog', 'mamal', 'rat']
['mamal', 'rat']
['rat', 'rabbit']

Альтернатива:

print([df1.loc[map(int, i.split(","))]["A"].tolist() for i in df2.fav_animal.tolist()])

Вывод:

[['dog', 'mamal', 'rat'], ['mamal', 'rat'], ['rat', 'rabbit']]
0 голосов
/ 21 ноября 2018

Вы можете использовать эту функцию, например:

def get_names(df, df2, name):
    indices = np.asarray(df2.loc[name].values[0].split(',')).astype(int)
    return indices.tolist(), df.loc[indices,:]['A'].tolist()

Так, например, если вы хотите fav_animals для имени x:

list_id, name_animal = get_names(df,df2, 'x')

print(list_id)
[1, 2, 3]

print(name_animal)
['dog', 'mamal', 'rat']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...