为了账号安全,请及时绑定邮箱和手机立即绑定

使用.map()在pandas DataFrame中有效创建其他列

使用.map()在pandas DataFrame中有效创建其他列

Helenr 2021-03-16 16:13:15
我正在分析形状类似于以下示例的数据集。我有两种不同类型的数据(abc数据和xyz数据):   abc1  abc2  abc3  xyz1  xyz2  xyz30     1     2     2     2     1     21     2     1     1     2     1     12     2     2     1     2     2     23     1     2     1     1     1     14     1     1     2     1     2     1我想创建一个为数据框中存在的每个abc列添加一个分类列的函数。使用列名列表和类别映射字典,我可以获得所需的结果。abc_columns = ['abc1', 'abc2', 'abc3']xyz_columns = ['xyz1', 'xyz2', 'xyz3']abc_category_columns = ['abc1_category', 'abc2_category', 'abc3_category']categories = {1: 'Good', 2: 'Bad', 3: 'Ugly'}for i in range(len(abc_category_columns)):    df3[abc_category_columns[i]] = df3[abc_columns[i]].map(categories)print df3最终结果:   abc1  abc2  abc3  xyz1  xyz2  xyz3 abc1_category abc2_category abc3_category0     1     2     2     2     1     2          Good           Bad           Bad1     2     1     1     2     1     1           Bad          Good          Good2     2     2     1     2     2     2           Bad           Bad          Good3     1     2     1     1     1     1          Good           Bad          Good4     1     1     2     1     2     1          Good          Good           Bad虽然最后的for循环工作正常,但我觉得我应该使用Python的lambda函数,但似乎无法弄清楚。有没有更有效的方法来映射动态数量的abc类型的列?
查看完整描述

1 回答

?
慕仙森

TA贡献1827条经验 获得超7个赞

您可以将applymap其与dictionaryget方法一起使用:


In [11]: df[abc_columns].applymap(categories.get)

Out[11]:

   abc1  abc2  abc3

0  Good   Bad   Bad

1   Bad  Good  Good

2   Bad   Bad  Good

3  Good   Bad  Good

4  Good  Good   Bad

并将其放入指定的列:


In [12]: abc_categories = map(lambda x: x + '_category', abc_columns)


In [13]: abc_categories

Out[13]: ['abc1_category', 'abc2_category', 'abc3_category']


In [14]: df[abc_categories] = df[abc_columns].applymap(categories.get)

注意:您可以abc_columns使用列表推导来相对有效地构建:


abc_columns = [col for col in df.columns if str(col).startswith('abc')]


查看完整回答
反对 回复 2021-03-24
  • 1 回答
  • 0 关注
  • 289 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信