我的一些数据如下:
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,那么这两行不应该收敛(这可能是我需要跟进的错误)。
(为了扩展上面的例子,事实上可能有任意数量的行 - 给定任意数量的列 - 应该能够汇聚成一行。)
这感觉就像是一个应该通过熊猫解决的问题,但我无法找到一个优雅的解决方案。
答案 0 :(得分:11)
让我们假设你有一些函数combine_it
,给定一组具有重复值的行,返回一行。首先,按date
和name
分组:
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')