我有以下数据:

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.chainGroupBy.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]

09-10 04:35
查看更多