Python Pandas - 合并大多数重复的行

时间:2013-06-09 04:39:23

标签: python duplicates pandas dataframe

我的一些数据如下:

date, name, value1, value2, value3, value4
1/1/2001,ABC,1,1,,
1/1/2001,ABC,,,2,
1/1/2001,ABC,,,,35

我试图达到可以运行的程度

data.set_index(['date', 'name'])

但是,随着数据的原样,当然有重复(如上所示),所以我不能这样做(我不希望索引有重复,我不能简单地drop_duplicates( ),因为这会丢失数据)。

我希望能够将具有相同[date,name]值的行强制为单行,如果它们可以根据某些值NaN成功收敛(类似于combine_first()的行为)。例如,上述内容最终将在

date, name, value1, value2, value3, value4
1/1/2001,ABC,1,1,2,35

如果两个值不同且一个不是NaN,那么这两行不应该收敛(这可能是我需要跟进的错误)。

(为了扩展上面的例子,事实上可能有任意数量的行 - 给定任意数量的列 - 应该能够汇聚成一行。)

这感觉就像是一个应该通过熊猫解决的问题,但我无法找到一个优雅的解决方案。

3 个答案:

答案 0 :(得分:11)

让我们假设你有一些函数combine_it,给定一组具有重复值的行,返回一行。首先,按datename分组:

grouped = data.groupby(['date', 'name'])

然后只需应用聚合功能和热潮即可:

result = grouped.agg(combine_it)

您还可以通过传递agg字典来为不同的列提供不同的聚合函数。

答案 1 :(得分:0)

如果您没有数字字段值,则聚合计数,分钟,总和等既不可能也不合理。不过,您仍然可能希望根据一个或多个主键将重复记录折叠到单个记录(例如)。

# Firstly, avoid Nan values in the columns you are grouping on!
df[['col1', 'col2']] =  df[['col1', 'col2']].fillna('null')


  # Define your own customized operation in pandas agg() function
df = df.groupby(['col1', 'col2']).agg({'SEARCH_TERM':lambda x: ', '.join(tuple(x.tolist())),

                                     'HITS_CONTENT':lambda x: ', '.join(tuple(x.tolist()))}
                                   )

按一个或多个列分组并通过首先转换为列表,然后转换为元组,最后转换为字符串来折叠值。如果您愿意,也可以将它们保存为存储在每个字段中的列表或元组,或者应用agg。函数和字典对不同列的操作非常不同。

答案 2 :(得分:0)

由于不重复按列的值,因此可以使用agg函数的技巧,如下所示:

data.groupby(['date', 'name']).agg('sum')