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

时间:2018-01-10 09:49:57

标签: python pandas pandas-groupby

给出以下数据框

InitilizeComponent()

最终目标是合并按名称分组的数据框并根据某些规则,例如

  • 如果其中一个重复的bigQueryR是字符串而另一个是df = pd.DataFrame({ 'identifier': ['1', '2', None], 'name': ['Tom', 'Peter', 'Peter'], 'registered': [True, False, True] }) ,则使用字符串identifier
  • 对所有None条目执行逻辑identifier

所以结果看起来应该是

or

我用registered尝试过,但也许这是错误的方式?

drop_duplicates不要让我添加具体规则。

2 个答案:

答案 0 :(得分:1)

我认为您需要使用dropnadrop_duplicatesany自定义功能:

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

答案 1 :(得分:1)

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

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

“无”是“彼得”的第一个标识符。您可以通过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