Заменить список в значениях списка значением dict - PullRequest
1 голос
/ 20 сентября 2019

У меня есть столбец панд date_df['col_name'], который выглядит следующим образом:

[[1, 7]]
[[1, 7]]
[[1, 11], [13, 13]]
[[1, 11], [14, 14], [16, 18]]
[[1, 7]]
[[1, 8], [15, 16]]
[[1, 11]]
[[1, 8], [15, 16]]

Где каждый элемент является ключом dict.И мне нужно заменить каждый элемент из списков в списке на значение из dict:

date_dict = 
{0: Timestamp('2017-01-01 00:00:00', freq='MS'),
 1: Timestamp('2017-02-01 00:00:00', freq='MS'),
 2: Timestamp('2017-03-01 00:00:00', freq='MS'),
 3: Timestamp('2017-04-01 00:00:00', freq='MS'),
 4: Timestamp('2017-05-01 00:00:00', freq='MS'),
 5: Timestamp('2017-06-01 00:00:00', freq='MS'),
 ...
 34: Timestamp('2019-11-01 00:00:00', freq='MS'),
 35: Timestamp('2019-12-01 00:00:00', freq='MS')}

Я пытался:

for list_ in date_df['col_name']:
    for idx, item in enumerate(list_):
        if item in date_dict:
            list_[idx] = date_dict[item]

, но это решение возвращает TypeError: unhashable type: 'list'

Есть ли способ заменить список значений на значения dict?

1 Ответ

2 голосов
/ 20 сентября 2019

Вам нужно другое понимание вложенного списка для цикла по внутренним спискам:

date_df['col_name'] = date_df['col_name'].apply(lambda x: [[d[z] for z in y] for y in x])

date_df['col_name'] = [[[d[z] for z in y] for y in x] for x in  date_df['col_name']]

Или возможно использовать .get функцию с возможным указанием значения по умолчанию, если не совпадает:

#some default value
m = pd.Timestamp('2000-01-01 00:00:00', freq='MS')
date_df['col_name']=date_df['col_name'].apply(lambda x: [[d.get(z, m) for z in y] for y in x])

date_df['col_name'] = [[[d.get(z, m) for z in y] for y in x] for x in  date_df['col_name']]

Образец :

print (date_df)
    col_name
0    [[1,2]]
1  [[100,3]]

d = {0: pd.Timestamp('2017-01-01 00:00:00', freq='MS'),
 1: pd.Timestamp('2017-02-01 00:00:00', freq='MS'),
 2: pd.Timestamp('2017-03-01 00:00:00', freq='MS'),
 3: pd.Timestamp('2017-04-01 00:00:00', freq='MS')}

m = pd.Timestamp('2000-01-01 00:00:00', freq='MS')
date_df['col_name']=date_df['col_name'].apply(lambda x: [[d.get(z,m) for z in y] for y in x])
print (date_df)
                                       col_name
0  [[2017-02-01 00:00:00, 2017-03-01 00:00:00]]
1  [[2000-01-01 00:00:00, 2017-04-01 00:00:00]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...