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