pandas 基于列值从字典新建列

kuarbcqp  于 2023-03-28  发布在  其他
关注(0)|答案(2)|浏览(124)

我正在尝试创建一个新列,该列使用字典根据不同列中的某些条件分配值。
下面是字典和数据框架

fee = {
('CL',  'SB') :295,
('CL',  'NB') :150,
('BR',  'SB') :120,
('BR',  'NB') :120,
('AR',  'SB') :150,
('AR',  'NB') :150,
('CN',  'SB') :285,
('CN',  'NB') :215,
('MX',  'SB') :115,
('MX',  'NB') :115,
('UK',  'SB') :170,
('UK',  'NB') :120,
}

dateval= pd.DataFrame({'Country': ['CL', 'CL', 'MX', 'UK', 'CN', 'AR', 'AR', 'BR'],
                    'direction': ['SB', 'NB', 'SB', 'SB', 'NB', 'SB', 'SB', 'NB'],
                    'times': [1, 1, 1, 2, 1, 2, 1, 2],
                    'amountdesired': [295,150,115,290,215,300,150,240]
                }   
                    
                    )

下面的代码在times = 1时运行良好

dateval['amountdesired']=dateval.loc[(dateval['times'].isin([1]))][['Country', 'direction']].apply(tuple, axis=1 ).map(fee)

当times = 2时,我希望对国家/地区使用这两个值
我知道我最终可以改变我的字典的结构,但我想知道我是否可以保持这样的结构,并使用一些聪明的方法来实现这一点。
谢谢你的帮助。

lbsnaicq

lbsnaicq1#

您的尝试似乎已接近apply()方法。
这是我的食谱:

  • 创建新列(称为合并列)。
  • 使用lambdaif row['times'] == 1语句
  • 最后else row['Country'] + " + " + row['direction']

因此,在上面的情况下,您可以这样做:

import pandas as pd

fee = {
('CL',  'SB') :295,
('CL',  'NB') :150,
('BR',  'SB') :120,
('BR',  'NB') :120,
('AR',  'SB') :150,
('AR',  'NB') :150,
('CN',  'SB') :285,
('CN',  'NB') :215,
('MX',  'SB') :115,
('MX',  'NB') :115,
('UK',  'SB') :170,
('UK',  'NB') :120,
}


dateval= pd.DataFrame({'Country': ['CL', 'CL', 'MX', 'UK', 'CN', 'AR', 'AR', 'BR'],
                    'direction': ['SB', 'NB', 'SB', 'SB', 'NB', 'SB', 'SB', 'NB'],
                    'times': [1, 1, 1, 2, 1, 2, 1, 2],
                    'amountdesired': [295,150,115,290,215,300,150,240]
                }   
                    
                    )

# combine columns based on column3 values
dateval['combined'] = dateval.apply(
    lambda row: row['Country'] if row['times'] == 1 
    else row['Country'] + " + " + row['direction'], axis=1)

print(dateval)

这给出了:

wwwo4jvm

wwwo4jvm2#

D.L的回答让我非常接近我想要的结果。
这就是我如何解决

dateval['combined'] = dateval.apply(
    lambda row: fee[tuple([row['Country'],row['direction']])] if row['times'] == 1  else fee[tuple([row['Country'],'SB'])]+fee[tuple([row['Country'],'NB'])]  , axis=1)

谢谢大家!

相关问题