如何清理 pandas 数据框中的列表和元素列表?

How do I clean a list, and list of list of elements in a pandas dataframe?

已编辑:

写完后:

m = df.explode('ID1').groupby('ID1')['ID2'].agg(list)

我有以下数据框:

Ref         
45263     [['3105-BB', '3106-BB', '3201-BB', '3202-BB'],...
45256     [['3105-BB', '3106-BB', '3201-BB', '3202-BB'],...
48565     [['3159-CC', '3217-CC'], ['3159-CC', '3217-CC']]
49365     [['3159-CC', '3217-CC'], ['3159-CC', '3217-CC']]
47548     [['3107-CC', '3108-CC', '3201-CC', '3202-CC'],...

在右侧的列中,如何删除列表括号的列表以及每行的重复项。理想情况下,我希望每行只有一个列表?

例如输出:

Ref         
45263     ['3105-BB', '3106-BB', '3201-BB', '3202-BB']
45256     ['3105-BB', '3106-BB', '3201-BB', '3202-BB']
48565     ['3159-CC', '3217-CC']
49365     ['3159-CC', '3217-CC']
47548     ['3107-CC', '3108-CC', '3201-CC', '3202-CC']

之后我会在下面使用m:

df['ID4'] = df['Ref'].map(m)

这将 return 我正在寻找的最终数据框。

set comprehension 与嵌套列表的展平值一起使用:

df['ID'] = df['ID'].apply(lambda x: list(set(z for y in x for z in y)))

如果顺序很重要,请使用带有 keys 技巧的字典:

df['ID'] = df['ID'].apply(lambda x: list(dict.fromkeys([z for y in x for z in y]).keys()))

如果下一个处理是地图,则需要展开列表:

df = df.explode('ID').reset_index(drop=True)
print (df)
      Ref       ID
0   45263  3105-BB
1   45263  3106-BB
2   45263  3202-BB
3   45263  3201-BB
4   45256  3105-BB
5   45256  3106-BB
6   45256  3202-BB
7   45256  3201-BB
8   48565  3217-CC
9   48565  3159-CC
10  49365  3217-CC
11  49365  3159-CC
12  47548  3202-CC
13  47548  3108-CC
14  47548  3201-CC
15  47548  3107-CC

样本:

df['ID1'] = df['ID'].apply(lambda x: list(set(z for y in x for z in y)))
df['ID2'] = df['ID'].apply(lambda x: list(dict.fromkeys([z for y in x for z in y]).keys()))
print (df)
     Ref                                        ID  \
0  45263    [[3105-BB, 3106-BB, 3201-BB, 3202-BB]]   
1  45256    [[3105-BB, 3106-BB, 3201-BB, 3202-BB]]   
2  48565  [[3159-CC, 3217-CC], [3159-CC, 3217-CC]]   
3  49365  [[3159-CC, 3217-CC], [3159-CC, 3217-CC]]   
4  47548    [[3107-CC, 3108-CC, 3201-CC, 3202-CC]]   

                                    ID1                                   ID2  
0  [3105-BB, 3106-BB, 3202-BB, 3201-BB]  [3105-BB, 3106-BB, 3201-BB, 3202-BB]  
1  [3105-BB, 3106-BB, 3202-BB, 3201-BB]  [3105-BB, 3106-BB, 3201-BB, 3202-BB]  
2                    [3217-CC, 3159-CC]                    [3159-CC, 3217-CC]  
3                    [3217-CC, 3159-CC]                    [3159-CC, 3217-CC]  
4  [3202-CC, 3108-CC, 3201-CC, 3107-CC]  [3107-CC, 3108-CC, 3201-CC, 3202-CC]  

编辑:

f = lambda x: list(set(z for y in x for z in y)
df.explode('ID1').groupby('ID1')['ID2'].agg(f)