Py学习  »  Python

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

hydradon • 6 年前 • 2203 次点击  

我有以下带有列的数据框 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”属性

我该如何解决?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/52768
文章 [ 1 ]  |  最新文章 6 年前
jezrael
Reply   •   1 楼
jezrael    6 年前

因为 | 是否需要特殊的正则表达式字符 \ 在里面 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)