代码之家  ›  专栏  ›  技术社区  ›  Michael Dorner Satyanarayana

在特定规则上合并重复的熊猫行

  •  3
  • Michael Dorner Satyanarayana  · 技术社区  · 7 年前

    给定以下数据框

    df = pd.DataFrame({
        'identifier': ['1', '2', None], 
        'name': ['Tom', 'Peter', 'Peter'], 
        'registered': [True, False, True]
    })
    

    最终目标是根据名称和特定规则合并数据帧,例如:。

    • 如果其中一个重复 identifier 是字符串,另一个是 None ,然后使用字符串 标识符
    • 执行逻辑 or 致所有人 registered 条目

    所以结果应该是

    df_result = pd.DataFrame({
        'identifier': ['1', '2'], 
        'name': ['Tom', 'Peter'], 
        'registered': [True, True]
    })
    

    我试过了 groupby ,但也许这根本就是错误的方式?

    drop_duplicates 不要让我添加特定规则。

    2 回复  |  直到 7 年前
        1
  •  1
  •   jezrael    7 年前

    我认为您需要自定义函数 dropna , drop_duplicates any :

    df = pd.DataFrame({
        'identifier': ['1', '2', None, '2'], 
        'name': ['Peter', 'Peter', 'Peter', 'Peter'], 
        'registered': [True, False, True, True]
    })
    print (df)
      identifier   name  registered
    0          1  Peter        True
    1          2  Peter       False
    2       None  Peter        True
    3          2  Peter        True
    
    def f(x):
        return pd.DataFrame({'identifier': x['identifier'].dropna().drop_duplicates(), 
                             'registered': x['registered'].any()})
    
    df = df.groupby('name').apply(f).reset_index(level=1, drop=True).reset_index()
    print (df)
        name identifier  registered
    0  Peter          1        True
    1  Peter          2        True
    
        2
  •  1
  •   cs95 abhishek58g    7 年前

    让我们稍微修改一下您的数据。

    df = pd.DataFrame({
        'identifier': ['1', None, '2'], 
        'name': ['Tom', 'Peter', 'Peter'], 
        'registered': [True, False, True]
    })
    
    df
    
      identifier   name  registered
    0          1    Tom        True
    1       None  Peter       False
    2          2  Peter        True
    

    “None”是“Peter”的第一个标识符。你可以用 sort_values 呼叫,然后,您呼叫 groupby + agg .

    df.sort_values(['identifier'])\
      .groupby('name', as_index=False)\
      .agg({'identifier' : 'first', 'registered' : any})
    
        name  registered identifier
    0  Peter        True          2
    1    Tom        True          1