当某些列表包含 Null 值时如何展平列表列?

How to flatten column of lists when some contain Null values?

这可能是一个非常明显的问题,但我有一列包含我试图展平的列表:即 [AB, CD] -> AB, CD.

示例数据框:

data = [
    ["ABC", ["AB", "AB", "EF"]],
    ["DEF", ["CD", "EF"]],
    ["GHI", ["JK"]],
    [
        "JKL",
        np.nan,
    ],
]

df = pd.DataFrame(data, columns=["ID", "list"])
df

我正在将此函数应用于所述列:

def func(string):
    flattened_string = ", ".join(map(str, string))
    return flattened_string
df = df["list_column"].apply(func)

但是,有几行包含 NaN 个值,这些值会引发错误 "TypeError: 'float' object is not iterable"。有什么办法可以修改这个函数来解决这个问题吗?或者也许(可能)有更好的方法来做到这一点?

谢谢!!!

您需要将该列中的 NaN 填充为空但可迭代的内容,例如 ""[]。您还可以将函数简化为 .apply(", ".join),假设您要加入的列表列只是字符串。

df["list"] = df["list"].fillna("").apply(", ".join)

如果需要保留列中的 NaN 值,我们可以使用列中的 setting with enlargement by only joining the notna 值并赋值回来:

df['list'] = df.loc[df['list'].notnull(), 'list'].map(','.join)

或者如果列表中有非字符串:

df['list'] = df.loc[
    df['list'].notnull(), 'list'
].map(lambda x: ','.join(map(str, x)))

df:

    ID      list
0  ABC  AB,AB,EF
1  DEF     CD,EF
2  GHI        JK
3  JKL       NaN  # Still NaN not empty string