使用组名作为inpu,按组分配值

2024-10-01 00:17:54 发布

您现在位置:Python中文网/ 问答频道 /正文

这可能是一个简单的问题,但我想不出来

我有两个数据帧

import numpy as np
import pandas 

da0 = pandas.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
                               'foo', 'bar', 'foo', 'foo'],
                        'B' : ['two', 'one', 'two', 'three',
                               'three', 'one', 'two', 'two'],
                        'C' : np.random.randn(8),
                        'D' : np.random.randn(8)
                       })

da1 = pandas.DataFrame({'E' : ['one', 'two', 'three'],
                        'F' : ['alpha', 'beta', 'gamma']
                       })

我想在da0中添加一个新列。此列应该从da1中的'F'列中获取与da1中的'E'da0中的'B'之间的匹配对应的值。在本例中,结果应为

da0 = pandas.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
                               'foo', 'bar', 'foo', 'foo'],
                        'B' : ['two', 'one', 'two', 'three',
                               'three', 'one', 'two', 'two'],
                        'C' : np.random.randn(8),
                        'D' : np.random.randn(8),
                        'new': ['beta', 'alpha', 'beta', 'gamma', 'gamma', 
                                'alpha', 'beta', 'beta'] 
                       })

我试着用'B'da0进行分组,然后使用transform,但是我不知道如何在自定义函数中使用组的名称

我该怎么做


Tags: alphadataframepandasfoonpbarrandomone
2条回答

您可以使用replace

da0['New']=da0.B.replace(dict(zip(da1.E,da1.F)))
da0
Out[2004]: 
     A      B         C         D    New
0  foo    two  0.399663  1.236391   beta
1  bar    one  0.903984  0.640332  alpha
2  foo    two -0.025079 -0.420485   beta
3  bar  three  1.696489  0.023614  gamma
4  foo  three  0.669597  1.628613  gamma
5  bar    one -2.033584  0.081647  alpha
6  foo    two -0.207683  0.058281   beta
7  foo    two -0.571093  0.436593   beta

这是一种方式:

da0['new'] = da0['B'].map(da1.set_index('E')['F'])

结果

     A      B         C         D    new
0  foo    two -0.616481 -0.679958   beta
1  bar    one  1.721246 -0.985037  alpha
2  foo    two  0.782059 -0.694043   beta
3  bar  three -1.088806  1.855281  gamma
4  foo  three  0.302535  0.042422  gamma
5  bar    one  1.893247 -1.218680  alpha
6  foo    two -2.337719 -0.077325   beta
7  foo    two  0.137897  1.709476   beta

解释

  • ^{}可以将序列作为输入
  • 使用set_index确保来自da0['B']的值与da1['E']对齐

相关问题 更多 >