【问题标题】:inserting a value into a dataframe based on a comparison condition根据比较条件将值插入数据框中
【发布时间】:2020-06-10 14:18:47
【问题描述】:

我正在尝试根据与另一个数据帧的比较将值插入数据帧。 这是一个例子:

>>> import pandas as pd
>>> import numpy as np
>>> print(df)
>>> df
      name                          
  0  richard Finn, Tim Maltby       
  1  Fernando Lebrija                          

>>> df2

       Fullname             id
  0   richard Finn          500
  1   Tim Maltby            699
  2   Fernando Lebrija      300

想要的输出是:

 >>> df
      name                            id              
  0  richard Finn, Tim Maltby        500,699
  1  Fernando Lebrija                300

我尝试使用:

df['id'] = np.where((df['name']==df2['Fullname']), df2['id]', df['id'])

但它给了我以下错误: `SyntaxError: 无效语法

【问题讨论】:

  • 4 个答案中没有一个足够好 accept?

标签: python pandas numpy comparison-operators


【解决方案1】:

您可以进行拆分、分解、然后映射和分组:

df['id'] = (df['name'].str.split(',\s*')
    .explode()
    .map(df2.set_index('Fullname')['id'])
    .groupby(level=0).agg(list)
)

输出:

                       name          id
0  richard Finn, Tim Maltby  [500, 699]
1          Fernando Lebrija       [300]

【讨论】:

    【解决方案2】:

    另一种方式,使用列表推导

    mapper = df2.set_index('Fullname')['id'].to_dict()
    df['id'] = df['name'].apply(lambda x: ','.join([str(mapper.get(i.strip(), '')) for i in x.split(',')]))
    
    
    
        name                        id
    0   richard Finn, Tim Maltby    500,699
    1   Fernando Lebrija            300
    

    【讨论】:

      【解决方案3】:

      我们也可以探索series.replace

      s = dict(df2[['Fullname','id']].astype(str).to_numpy())
      df1['id'] = df1['name'].replace(s,regex=True)
      

      print(df1)
      
                             name        id
      0  richard Finn, Tim Maltby  500, 699
      1          Fernando Lebrija       300
      

      【讨论】:

      • 这很聪明
      • @Vaishali 谢谢 :) 我最初的想法是你的解决方案的理解版本,但本来是多余的
      • @Vaishali 我的想法是这样的:[','.join([*map(lambda x: mapper.get(x.strip()),i.split(','))]) for i in df1['name']] 我在想数据会更快..(现已测试)
      • 太棒了,以后会用这个。我为老熊猫用户添加了一个stack 变体(:
      【解决方案4】:

      我们可以使用str.splitstackmerge

      final = pd.merge(
          df1["name"]
          .str.split(",", expand=True)
          .stack()
          .str.strip()
          .to_frame("Fullname")
          .reset_index(level=0),
          df2,
          on="Fullname",
      ).astype(str).groupby("level_0").agg(",".join).rename_axis("", axis=0)
      

      print(final)
      
                        Fullname       id
      
      0  richard Finn,Tim Maltby  500,699
      1         Fernando Lebrija      300
      

      【讨论】:

        猜你喜欢
        • 2020-10-06
        • 1970-01-01
        • 2021-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多