如何映射值到位?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (8)

我有这样的数据帧:

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'}

我现在想要匹配的列map的值。dregex ^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.filter(regex='^c\d+$').apply(lambda x: x.replace(d))

您可能还会发现np.where此类过滤问题很有用。

用户回答回答于

也许不是最聪明的方式,但我觉得很整洁......:

# Your code
df = pd.DataFrame({'c1': list('aba'), 'c2': list('aaa'), 'ignore_me': list('bbb'), 'c3': list('baa')})
d = {'a': "foo", 'b': 'bar'}

# Solution
import re  

# Pre-compile the regex object in case there is a huge list of columns....
regex = re.compile(r'^c\d+$')

# Python 3's `filter` returns a `generator`, add a `list` wrapper to get the columns 
cols = list(filter(regex.search, df.columns))
# output ['c1', 'c2', 'c']

df[cols] = df.filter(cols).apply(lambda x: x.map(d))

扫码关注云+社区

领取腾讯云代金券