展平 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]
我有一个 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]