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

Posted

技术标签:

【中文标题】当某些列表包含 Null 值时,如何展平列表列?【英文标题】:How to flatten column of lists when some contain Null values? 【发布时间】:2021-12-03 04:30:07 【问题描述】:

这可能是一个非常明显的问题,但我有一列包含我想要展平的列表:即[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"。有什么办法可以修改这个功能来解决这个问题吗?或者也许(可能)有更好的方法来做到这一点?

谢谢!!!

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

一个字。聪明+1 哇,我真的过于复杂了。谢谢!!! 终于在你的雷达下偷偷给 Pandas 答案 Corralien :D【参考方案2】:

如果需要保留列中的NaN值,我们可以使用setting with enlargement,只需加入列中的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

【讨论】:

以上是关于当某些列表包含 Null 值时,如何展平列表列?的主要内容,如果未能解决你的问题,请参考以下文章

如何在保留列表名称和值的同时展平一列列表? [r] [重复]

Python:如何展平每个子列表是一个包含单个浮点数的列表列表[关闭]

如何展平包含具有不同数量字典的列表的列表? [复制]

如何将 java 映射展平为列表,以便列表交替键和值?

C# DateTime OrderBy 当列表包含一些相同的 DateTime 值时

如何使用 HTML 列表框和 SQL 代码显示表格中的某些列?