首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何就地映射值?

如何就地映射值?
EN

Stack Overflow用户
提问于 2019-06-03 05:40:27
回答 2查看 124关注 0票数 3

我有一个这样的数据帧:

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的值map到与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

是否有更智能的解决方案可以避免tempory数据帧?

EN

回答 2

Stack Overflow用户

发布于 2019-06-03 06:27:46

也许不是最聪明的方式,但我认为这是相当巧妙的……

# 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 # cs95 provided a better solution to pick columns!

# 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', 'c3']


# PICK one of the following...:

# The normal way
df[cols] = df[cols].apply(lambda x: x.map(d))

# OR use `applymap`
df[cols] = df[cols].applymap(lambda x: d[x])

# OR if you prefer not to see `lambda` at all!
df[cols] = df[cols].applymap(d.get)

df
票数 1
EN

Stack Overflow用户

发布于 2019-06-03 06:35:40

尝试替换?

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56419136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档