【问题标题】:How to use multiple conditions based on 2 columns to create the new column in pandas?如何使用基于 2 列的多个条件在 pandas 中创建新列?
【发布时间】:2020-11-09 17:57:05
【问题描述】:

我有 2 个字典,我需要根据几个条件创建列。

dict1 = {'100': BMW, '200': Audi, '300': 'VW'}   
dict2 = {'100': Mercedes, '200': Nissan, '300': 'Renault'}

df:

class          Code
1              200
1              300
2              300
1              100
2              100   

我实际上想在 class 为 1 时使用 dict1,而在 class 为 2 时使用 dict2

想要的输出应该是这样的:

  class            Code         Car
    1              200          Audi
    1              300          VW
    2              300          Renault
    1              100          BMW
    2              100          Mercedes

如果我没有条件,我可以使用 .map,但我不确定现在该使用什么:

df['Car'] = df['Code'].map(dict1)

【问题讨论】:

  • @jezrael 你能帮忙吗?

标签: python pandas dataframe dictionary conditional-statements


【解决方案1】:

如果只是两个字典/类:

# note that your dictionary has string key
df['Code'] = df.Code.astype(str)

df['car'] = np.where(df['class']==1,
                     df['Code'].map(dict1),
                     df['Code'].map(dict2) )

输出:

   class Code       Car
0      1  200      Audi
1      1  300        VW
2      2  300   Renault
3      1  100       BMW
4      2  100  Mercedes

【讨论】:

  • 谢谢:) 如果我有超过 2 个字典,那么最好的写作方法是什么?
  • 对 3 个字典有什么想法吗?
  • np.select 怎么样?
  • 我如何使用np.select 使用 3 个字典?
【解决方案2】:

我用下面的代码测试过

import pandas as pd
dict1 = {'100': 'BMW', '200': 'Audi', '300': 'VW'}
dict2 = {'100': 'Mercedes', '200': 'Nissan', '300': 'Renault'}
df = pd.DataFrame({'Class':[1,1,2,1],'Code':['200','300','300','100']})
def f(row):
    if row['Class'] == 1:
        val = dict1[row['Code']]
    elif row['Class'] ==2:
        val = dict2[row['Code']]
    else:
        val = dict2[row['Code']]
    return val

df['Car']= df.apply(f,axis=1)

print(df)

打印出来

    Class Code     Car
0      1  200     Audi
1      1  300       VW
2      2  300  Renault
3      1  100      BMW

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-04
    • 1970-01-01
    • 2018-08-09
    • 2017-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多