我具有df的以下结构(作为示例):
根据评论编辑数据
import pandas as pd
data = {'ID':["abc", "abc", "123", "xyz", "xyz"], 'valid':[["A", "B"], [], [], ["A", "B", "C"], []],
'not_valid':[[], ["C", "D"], ["A", "B", "C", "D"], [], ["D"]],
'other_data': ["1", "1", "3", "4", "4"]}
df = pd.DataFrame(data)
这使:
ID valid not_valid other_data
abc [A, B] [] 1
abc [] [C, D] 1
123 [] [A, B, C, D] 3
xyz [A, B, C] [] 4
xyz [] [D] 4
结果,我想要的是以下内容:
ID valid not_valid other_data
abc [A, B] [C, D] 1
123 [] [A, B, C, D] 3
xyz [A, B, C] [D] 4
我想知道如何将两个列valid
以及not_valid
每个唯一的ID合并在一起(并非每个ID都必须像在这种情况下那样具有两个条目123
)。
虽然我可以删除重复项
df.drop_duplicates(subset=['ID']).reset_index()
我显然丢失了重复ID的一半数据。
您可以使用以下方法将值展平:将值转换为集合,然后转换为中的列表GroupBy.agg
:
cols = ['valid','not_valid']
df = df.groupby('ID', sort=False)[cols].agg(lambda x: list(set(z for y in x for z in y)))
print (df)
valid not_valid
ID
abc [A, B] [D, C]
123 [] [A, D, B, C]
xyz [A, B, C] [D]
编辑:如果每个组的其他列的所有值都相同,请ID
使用:
#grouping by all columns without valid, not_valid
c = df.columns.difference(['valid','not_valid']).tolist()
f = lambda x: list(set(z for y in x for z in y))
df1 = df.groupby(c, sort=False, as_index=False).agg(f).reindex(df.columns, axis=1)
print (df1)
ID valid not_valid other_data
0 abc [A, B] [D, C] 1
1 123 [] [A, D, B, C] 3
2 xyz [A, B, C] [D] 4
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句