展平 pandas 中包含 nan 的嵌套列表

flatten nested list in pandas containing nan

我有一个 table 这样的:

index | country
---------------
1     | [nan]
2     | [nan, DE]
3     | [nan, [IT, DE]]
4     | [[FR]]
5     | [[AE], nan, [AE,  MT], [MX]]

而且我需要将此列变成一个没有 nans 的唯一值的平面列表

index | country
---------------
1     | []
2     | [DE]
3     | [IT, DE]
4     | [FR]
5     | [AE, MT, MX]

作为第一步,我尝试使用此函数来展平列表

df.applymap(lambda x: [z for y in x for z in y])

但我收到以下错误:

TypeError: 'float' object is not iterable

我尝试了在这个 SO 问题 here 中找到的其他几个函数,但最终都给出了同样的错误。

这应该适用于任何嵌套列表

from collections.abc import Iterable
def flatten(l):
    for el in l:
        if isinstance(el, Iterable) and not isinstance(el, (str, bytes)):
            yield from flatten(el)
        else:
            yield el

所以重新创建你的 df

import pandas as pd
df = pd.DataFrame([[[[float('nan')],[float('nan'), 'DE']]],
                   [[[float('nan'), ['IT', 'DE']]]],
                   [[[['FR']]]],
                   [[[['AE'], float('nan'), ['AE',  'MT'], ['MX']]]]],columns=['country'])

df['country'] = df['country'].apply(lambda x:list(set(flatten(x)))).apply(lambda x: [i for i in x if str(i) != 'nan'])

给出以下输出

    country
0   [DE]
1   [IT, DE]
2   [FR]
3   [AE, MT, MX]