有没有办法在一次调用中传递列的列表来映射字典的值?

我可以通过陈述每一列来做到这一点,但我想知道我是否可以缩短语法.

查看了this post个以供参考.

样本数据:

import pandas as pd
 
# initialize data of lists.
data = {'id': ['a', 'b', 'c', 'd', 'e'],
        'col1': ['PHX', 'BKN', 'X', 'PHX', 'X'],
        'col2': ['X', 'PHX', 'BKN', 'BKN', 'X'],
        'col3': ['PHX', 'BKN', 'PHX', 'BKN', 'PHX']
       }
 
df = pd.DataFrame(data)
df

  id col1 col2 col3
0  a  PHX    X  PHX
1  b  BKN  PHX  BKN
2  c    X  BKN  PHX
3  d  PHX  BKN  BKN
4  e    X    X  PHX

我想将此映射应用于col1col2,而不是col3:

name_dict = {'PHX' : 'PHO', 'BKN': 'NJN'}

所以是PHX -> PHOBKN -> NJN.

这将替换所有的列,但我需要列的子集:

df = df.replace(name_dict)

菊花链"替换"起作用了:

df = df.replace({'col1': name_dict}).replace({'col2': name_dict})

这也是可行的:

df = df.replace({'col1': name_dict, 'col2': name_dict})

我能把它缩短一点吗,比如:

df = df.replace({['col1', 'col2']: name_dict})

然而,这将导致TypeError: unhashable type: 'list'.

所需输出(更新col1col2值,但不更新col3):

  id col1 col2 col3
0  a  PHO    X  PHX
1  b  NJN  PHO  BKN
2  c    X  NJN  PHX
3  d  PHO  NJN  BKN
4  e    X    X  PHX

推荐答案

使用dict.fromkeys:

df.replace(dict.fromkeys(['col1', 'col2'], name_dict))

或者,如果要使用列列表进行修改,请执行以下操作:

cols = ['col1', 'col2']
df[cols] = df[cols].replace(name_dict)

输出:

  id col1 col2 col3
0  a  PHO    X  PHX
1  b  NJN  PHO  BKN
2  c    X  NJN  PHX
3  d  PHO  NJN  BKN
4  e    X    X  PHX

Python相关问答推荐

双情节在单个图上切换-pPython

Python-Polars:如何用两个值的平均值填充NA?

自动编码器和极坐标

使用Curses for Python保存和恢复终端窗口内容

如何才能将每个组比上一组增加N %?

自定义新元未更新参数

如何将我的位置与光强度数据匹配到折射图案曲线中?

如何计算列表列行之间的公共元素

根据不同列的值在收件箱中移动数据

为什么我的Python代码在if-else声明中的行之前执行if-else声明中的行?

Pytest两个具有无限循环和await命令的Deliverc函数

有症状地 destruct 了Python中的regex?

如何从在虚拟Python环境中运行的脚本中运行需要宿主Python环境的Shell脚本?

通过pandas向每个非空单元格添加子字符串

如何在Raspberry Pi上检测USB并使用Python访问它?

如何更改groupby作用域以找到满足掩码条件的第一个值?

在代码执行后关闭ChromeDriver窗口

pysnmp—lextudio使用next()和getCmd()生成器导致TypeError:tuple对象不是迭代器''

Numpyro AR(1)均值切换模型抽样不一致性

在Python中从嵌套的for循环中获取插值