代码之家  ›  专栏  ›  技术社区  ›  hydradon

Python:panda dataframe在每行中拆分字符串,偶尔有空行

  •  1
  • hydradon  · 技术社区  · 5 年前

    我有以下带有列的数据框 attr :

    attr
    valA
    
    valA||valB||valC
    vaB||valC
    

    请注意,第二行没有值。我要创建另一列,其中包含 属性

    attr               num_attr
    valA               1
                       0
    valA||valB||valC   3
    vaB||valC          2
    

    我试过:

    df["num_attr"] = df["attr"].map(lambda a: len(a.split("||")))
    

    但上面写着(我想是因为空行):

    AttributeError:“float”对象没有“split”属性

    我该如何解决?

    1 回复  |  直到 5 年前
        1
  •  1
  •   jezrael    5 年前

    因为 | 是否需要特殊的正则表达式字符 \ 在里面 Series.str.split ,然后通过 Series.str.len ,替换缺少的值并转换为整数:

    df["num_attr"] = df["attr"].str.split("\|\|").str.len().fillna(0).astype(int)
    print (df)
                   attr  num_attr
    0              valA         1
    1               NaN         0
    2  valA||valB||valC         3
    3         vaB||valC         2
    

    另一个类似的解决方案 Series.str.count 加上 1 :

    df["num_attr"] = df["attr"].str.count("\|\|").add(1).fillna(0).astype(int)
    

    如果想使用你的解决方案添加 if-else 声明 pandas.notna :

    df["num_attr"] = df["attr"].map(lambda a: len(a.split("||")) if pd.notna(a) else 0)
    

    或:

    df["num_attr"] = df["attr"].map(lambda a: a.count("||") + 1 if pd.notna(a) else 0)