Pandas объединить список в столбце данных с другим - PullRequest
0 голосов
/ 19 марта 2020

У меня есть 2 фрейма данных:

ID   LIST_VALUES
 1     [a,b,c]
 2     [a,n,t]
 3     [x]
 4     [h,h]


VALUE     MAPPING
 a         alpha
 b         bravo
 c         charlie
 n         november
 h         hotel
 t         tango
 x         xray

Мне нужно добавить новый столбец в первый фрейм данных, который показывает ЗНАЧЕНИЯ из второго фрейма данных на основе того, что находится в списке LIST_VALUES. Если значение дублируется в LIST_VALUES, показывайте его только один раз в выходных данных. Итак:

ID   LIST_VALUES    new_col
 1     [a,b,c]       alpha,bravo,charlie
 2     [a,n,t]       alpha,november,tango
 3     [x]           xray
 4     [h,h]         hotel

Я пытался объединить pd.merge, но я застреваю, поскольку не могу объединить элементы в списке.

df_new = df1.merge(df2, how='left', left_on='LIST_VALUES', right_on='VALUES') 

Это будет работать только тогда, когда LIST_VALUE имеет только 1 элемент, поэтому в этом примере ID 3. Мне нужно, чтобы он работал там, где в списке несколько значений.

Ответы [ 2 ]

0 голосов
/ 19 марта 2020

Одним из способов будет создание словаря из вашего второго фрейма данных с использованием set_index и to_dict. Затем используйте понимание вложенного списка, чтобы найти словарь, используя значения в списках:

d = df2.set_index('VALUE').MAPPING.to_dict()
# {'a': 'alpha', 'b': 'bravo', 'c': 'charlie', ...

df['new_col'] = [','.join([d[j] for j in i]) for i in df.LIST_VALUES]

print(df)

 ID LIST_VALUES                new_col
0   1   [a, b, c]   alpha,bravo,charlie
1   2   [a, b, c]   alpha,bravo,charlie
2   3         [x]                  xray
3   4      [h, h]           hotel,hotel

Настройка:

print(df2)

 VALUE   MAPPING
0     a     alpha
1     b     bravo
2     c   charlie
3     n  november
4     h     hotel
5     t     tango
6     x      xray

print(df)

   ID LIST_VALUES
0   1   [a, b, c]
1   2   [a, b, c]
2   3         [x]
3   4      [h, h]
0 голосов
/ 19 марта 2020

Использовать понимание списка с помощью карты Series так же, как словарь, в последний раз удалить дублирующиеся значения с помощью dict.fromkeys трюка и join значений вместе:

d = df2.set_index('VALUE')['MAPPING']
df1['new_col'] = [', '.join(dict.fromkeys([d[y] for y in x if y in d]).keys()) 
                                                               for x in df1['LIST_VALUES']]

print (df1)
   ID LIST_VALUES                 new_col
0   1   [a, b, c]   alpha, bravo, charlie
1   2   [a, n, t]  alpha, november, tango
2   3         [x]                    xray
3   4      [h, h]                   hotel

Если порядок новых значений не важен Возможно использовать set для удаления дубликатов:

d = df2.set_index('VALUE')['MAPPING']
df1['new_col'] = [', '.join(set([d[y] for y in x if y in d])) for x in df1['LIST_VALUES']]

print (df1)
   ID LIST_VALUES                 new_col
0   1   [a, b, c]   alpha, charlie, bravo
1   2   [a, n, t]  alpha, tango, november
2   3         [x]                    xray
3   4      [h, h]                   hotel
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...