【问题标题】:Changing pandas dataframe values based on dictionary根据字典更改熊猫数据框值
【发布时间】:2020-03-13 12:54:48
【问题描述】:

有没有办法使用字典或映射来替换值? 我有这样的数据框:

Q14r63: Audi                 Q14r2: BMW                 Q14r1: VW 

Selected                     Not Selected               Not Selected
Not Selected                 Selected                   Selected 
Selected                     Selected                   Not Selected 

我还有另一个为品牌提供代码的数据框。这个df当然也可以变成字典。

Brand           Code
Audi             63
BMW              2
VW               1

有没有什么方法可以获得输出,其中主 df 中的“选定”值可以随汽车品牌而变化?

期望的输出

Q14r63: Audi               Q14r2: BMW                 Q14r1: VW 

Audi                         NaN                       NaN 
NaN                          BMW                       VW 
Audi                         BMW                       NaN

【问题讨论】:

    标签: python pandas dataframe dictionary


    【解决方案1】:

    这是使用np.where的一种方法:

    import numpy as np
    df[:] = np.where(df.eq('Selected'), df.columns.str.split(': ').str[1], np.nan)
    
    print(df)
    
     Q14r63: Audi Q14r2: BMW Q14r1: VW
    0        Audi       NaN      NaN
    1         NaN       BMW       VW
    2        Audi       BMW      NaN
    

    【讨论】:

    • 我想使用第二个数据框,因为我有相当大的列字符串...有什么办法吗?
    • 如果列名的结构如上,使用第二个数据框只会使这项任务复杂化? @s_khan92
    • 这就是问题所在..我做了模范专栏..这就是我的专栏的样子Q14r63: Audi - Sometimes it is hard to remember all. Which of the following car brands do you know of even if only by name? Please also mark brands you mentioned already in the previous question.
    【解决方案2】:

    首先按df1['Brand'] 列和regex 提取,然后通过DataFrame.mask 的掩码设置值和DataFrame.where 的缺失值:

    v = df.columns.str.extract('(' + '|'.join(df1['Brand']) + ')', expand=False)
    print (v)
    Index(['Audi', 'BMW', 'VW'], dtype='object')
    

    m = df.eq('Selected')
    print (m)
       Q14r63: Audi  Q14r2: BMW  Q14r1: VW
    0          True       False      False
    1         False        True       True
    2          True        True      False
    

    df = df.mask(m, v[None, :]).where(m)
    print (df)
      Q14r63: Audi Q14r2: BMW Q14r1: VW
    0         Audi        NaN       NaN
    1          NaN        BMW        VW
    2         Audi        BMW       NaN
    

    numpy.whereDataFrame 构造函数的替代解决方案:

    df = pd.DataFrame(np.where(m, v, np.nan), index=df.index, columns=df.columns)
    print (df)
      Q14r63: Audi Q14r2: BMW Q14r1: VW
    0         Audi        NaN       NaN
    1          NaN        BMW        VW
    2         Audi        BMW       NaN
    

    【讨论】:

    • 谢谢..我试过了,它没有改变任何东西,也没有错误:(
    • @s_khan92 - Brand 列中没有空格?什么返回print (v)
    • @s_khan92 - 你的熊猫版本是什么?
    • V 工作正常。但是 m 给出的是 True False 值,它只检查是否有选择的字符串
    • @s_khan92 - 那么print (df.stack().unique()) 是什么?有值Selected 吗?还是不一样?
    【解决方案3】:

    试试

    brand_map = dict(zip(df2.Code, df2.Brand))
    {63: 'Audi', 2: 'BMW', 1: 'VW'}
    
    mapped_values = df.columns.str.extract('Q14r(\d+)')[0].astype(int).map(brand_map)
    df[:] = np.where(df == 'Selected', mapped_values, np.nan)
    
      Q14r63: Audi Q14r2: BMW Q14r1: VW
    0         Audi        NaN       NaN
    1          NaN        BMW        VW
    2         Audi        BMW       NaN
    

    【讨论】:

      【解决方案4】:

      df1 =

      Q14r63: Audi                 Q14r2: BMW                 Q14r1: VW 
      
      Selected                     Not Selected               Not Selected
      Not Selected                 Selected                   Selected 
      Selected                     Selected                   Not Selected 
      

      df2 =

      Brand           Code
      Audi             63
      BMW              2
      VW               1
      

      你可以这样做,

      for column in df1.columns: 
          brand = [x for x in df2['Brand'].values if x in column][0]
          df1[column] = df1[column].replace({'Selected': brand, 'Not Selected': 'NaN'})
      

      【讨论】:

        猜你喜欢
        • 2015-12-13
        • 2023-02-21
        • 1970-01-01
        • 2021-07-24
        • 1970-01-01
        • 2021-12-12
        • 2016-10-17
        • 2017-08-02
        • 2017-02-27
        相关资源
        最近更新 更多