Python 如何将值映射到位?

Python 如何将值映射到位?,python,pandas,dataframe,Python,Pandas,Dataframe,我有这样一个数据帧: df = pd.DataFrame({'c1': list('aba'), 'c2': list('aaa'), 'ignore_me': list('bbb'), 'c3': list('baa')}) c1 c2 ignore_me c3 0 a a b b 1 b a b a 2 a a b a 还有一本像这样的字典 d = {'a': "foo", 'b': 'bar'} 现在我想将d的值映

我有这样一个数据帧:

df = pd.DataFrame({'c1': list('aba'), 'c2': list('aaa'), 'ignore_me': list('bbb'), 'c3': list('baa')})

  c1 c2 ignore_me c3
0  a  a         b  b
1  b  a         b  a
2  a  a         b  a
还有一本像这样的字典

d = {'a': "foo", 'b': 'bar'}
现在我想
d
的值映射到与
regex
^c\d+$
匹配的列

我能行

df.filter(regex='^c\d+$').apply(lambda x: x.map(d))

    c1   c2   c3
0  foo  foo  bar
1  bar  foo  foo
2  foo  foo  foo
但是,如果缺少与正则表达式不匹配的所有列,则会出现错误

因此,我可以:

tempdf = df.filter(regex='^c\d+$')

df.loc[:, tempdf.columns] = tempdf.apply(lambda x: x.map(d))
它给出了所需的输出

    c1   c2 ignore_me   c3
0  foo  foo         b  bar
1  bar  foo         b  foo
2  foo  foo         b  foo

有没有一个更聪明的解决方案可以避免临时的数据帧?

也许不是最聪明的方法,但我认为这是非常巧妙的…:

#您的代码
df=pd.DataFrame({'c1':list('aba'),'c2':list('aaa'),'ignore_me':list('bbb'),'c3':list('baa'))
d={'a':'foo','b':'bar'}
#解决方案
import re#cs95提供了更好的列拾取解决方案!
#预编译regex对象,以防有大量列。。。。
regex=re.compile(r'^c\d+$)
#Python3的'filter'返回一个'generator',添加一个'list'包装器来获取列
cols=list(过滤器(regex.search,df.columns))
#输出['c1','c2','c3']
#选择以下选项之一…:
#正常方式
df[cols]=df[cols].apply(lambda x:x.map(d))
#或者使用“applymap”`
df[cols]=df[cols].applymap(λx:d[x])
#或者如果你根本不想看到“lambda”!
df[cols]=df[cols].applymap(d.get)
df
是否尝试更换

df.filter(regex='^c\d+$).apply(lambda x:x.replace(d))


您可能会发现这类过滤问题也很有用。

绝对有,请使用
str.contains

df.columns.str.contains(r'^c\d+$') # use raw strings, it's good hygene
# array([ True,  True, False,  True])
将掩码传递到
loc

df.loc[:, df.columns.str.contains(r'^c\d+$')] = df.apply(lambda x: x.map(d))
如果你想尽可能高效

m = df.columns.str.contains(r'^c\d+$')
df.loc[:, m] = df.loc[:, m].apply(lambda x: x.map(d))


这和我现在的输出没有什么不同。啊,对不起,我误解了。我以为
map
操作是插入
NaN
,而不是
过滤器。
df

    c1   c2 ignore_me   c3
0  foo  foo  b         bar
1  bar  foo  b         foo
2  foo  foo  b         foo