将列表值中的列表替换为dict值

卢莫斯

我有熊猫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的值替换列表中列表中的每个元素:

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值替换列表值?

耶斯列尔

您需要通过内部列表进行循环的另一个嵌套列表理解:

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

Este artigo é coletado da Internet.

Se houver alguma infração, entre em [email protected] Delete.

editar em
0

deixe-me dizer algumas palavras

0comentários
loginDepois de participar da revisão

Artigos relacionados