панды — объединяются в колонку с кортежами

#python #python-3.x #pandas #dataframe #data-manipulation

Вопрос:

У меня есть такой df:

 gt;gt;gt; df1   col_1 col_2 labels 0 aaa abc (71020,) 1 ddd ghi (99213, 99287,) 2 bbb cde (77085,) 3 eee ijk (99233, 71020, 36415,)  

и еще один df, подобный этому:

 gt;gt;gt; df2   71020 77085 36415 99213 99287 99233 labels_mg 0 1 0 1 0 0 1 (99233, 71020, 36415,) 1 1 0 0 0 0 0 (71020,) 2 0 0 0 1 1 0 (99213, 99287) 3 0 1 0 0 0 0 (77085,)  

и хотел бы создать df, соединив правой кнопкой выше 2 df, как показано ниже:

 col_1 col_2 labels 71020 77085 36415 99213 99287 99233 0 aaa abc (71020,) 1 0 0 0 0 0 1 ddd ghi (99213, 99287,) 0 0 0 1 1 0 2 bbb cde (77085,) 0 1 0 0 0 0 3 eee ijk (99233, 71020, 36415,) 1 0 1 0 0 1   

Вот что я пробовал, но это создает пустой фрейм данных с 0 строками, но содержит все имена столбцов.

 pd.merge(left=df1, right=df2, left_on=['labels'], right_on=['labels_mg'])  

кортежи анализируются как кортежи в обоих dfs. Я сделал ast.literal_eval по столбцам в обоих этих df после чтения из файлов в dfs pandas. оба dfs также не имеют общего индекса.

мои размеры df (528840, 207) и (528840, 5). как мне сделать это эффективно?

Комментарии:

1. Для меня работает правильно.

Ответ №1:

Была проблема, один кортеж был целыми числами, второй был заполнен строками, решение преобразует их в целые числа, такие как:

 import ast  df1['labels'] = df1['labels'].apply(ast.literal_eval) df2['labels_mg'] = df2['labels_mg'].apply(lambda x: tuple([int(y) for y in ast.literal_eval(x)]))   df = pd.merge(left=df1, right=df2, left_on=['labels'], right_on=['labels_mg']) print (df)  col_1 col_2 labels 71020 77085 36415 99213 99287  0 aaa abc (71020,) 1 0 0 0 0  1 ddd ghi (99213, 99287) 0 0 0 1 1  2 bbb cde (77085,) 0 1 0 0 0  3 eee ijk (99233, 71020, 36415) 1 0 1 0 0    99233 labels_mg  0 0 (71020,)  1 0 (99213, 99287)  2 0 (77085,)  3 1 (99233, 71020, 36415)