我有以下数据:
study_id list_value
1 ['aaa', 'bbb']
1 ['aaa']
1 ['ccc']
2 ['ddd', 'eee', 'aaa']
2 np.NaN
2 ['zzz', 'aaa', 'bbb']
我怎么能把它变成这样?
study_id list_value
1 ['aaa', 'bbb', 'ccc']
1 ['aaa', 'bbb', 'ccc']
1 ['aaa', 'bbb', 'ccc']
2 ['aaa', 'bbb', 'ddd', 'eee', 'zzz']
2 ['aaa', 'bbb', 'ddd', 'eee', 'zzz']
2 ['aaa', 'bbb', 'ddd', 'eee', 'zzz'] # order of list item doesn't matter
最佳答案
itertools.chain
和GroupBy.transform
首先,使用列表理解(我知道,这很凌乱,但这是最快的方法)去掉列中的nans。
df['list_value'] = [
[] if not isinstance(x, list) else x for x in df.list_value
]
接下来,分组
study_id
并在GroupBy.transform
中展开列表,并使用set
提取唯一值。from itertools import chain
df['list_value'] = df.groupby('study_id').list_value.transform(
lambda x: [list(set(chain.from_iterable(x)))]
)
作为最后一步,如果计划对单个列表项进行变异,则可能需要执行以下操作
df['list_value'] = [x[:] for x in df['list_value']]
如果没有,一个列表中的更改将反映在该组中的所有子列表中。
df
study_id list_value
0 1 [aaa, ccc, bbb]
1 1 [aaa, ccc, bbb]
2 1 [aaa, ccc, bbb]
3 2 [bbb, ddd, eee, aaa, zzz]
4 2 [bbb, ddd, eee, aaa, zzz]
5 2 [bbb, ddd, eee, aaa, zzz]