【问题标题】:How to flatten column of lists when some contain Null values?当某些列表包含 Null 值时,如何展平列表列?
【发布时间】: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"。有什么办法可以修改这个功能来解决这个问题吗?或者也许(可能)有更好的方法来做到这一点?

谢谢!!!

【问题讨论】:

    标签: python pandas flatten


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-08
      • 1970-01-01
      • 2019-05-07
      • 1970-01-01
      • 2013-04-24
      • 2021-02-06
      相关资源
      最近更新 更多