拆分功能不起作用

时间:2018-04-13 17:39:01

标签: python pandas

我正在努力确定为什么我的分割功能和代码不起作用。我有一个这样的专栏 -

RegionName
   阿拉巴马[编辑]
   奥本(奥本大学)
   佛罗伦萨(北阿拉巴马大学)
   杰克逊维尔
   。
   。
   。
等等..

以上条目显示了该列中的案例。我想要实现的是具有状态名称的条目,例如Alabama [编辑],我希望将其显示为NaN,对于剩余的其他条目,即该特定状态内的相应区域,我想在需要时清除所有这些条目。如果不需要清洁,我希望该条目保持完整。我使用下面的代码 -

for x in Town['RegionName']:
    if re.match(r"\s*\(",x):
        x.split('(').strip()
    elif re.match(r"\d+\[",x):
        x = np.NaN
    else:
        x

代码运行时没有任何错误,但所有条目都保持不变。所需的输出是 -

RegionName
   NaN的
   奥本
   佛罗伦萨
   杰克逊维尔
   。
   。
   。
需要清理的是 - 删除括号内的整个内容,所需内容和括号之间可能有空格,因此必须考虑到这一点。

请指教。

3 个答案:

答案 0 :(得分:2)

您需要将值设置回列表项

for i, x in enumerate(Town['RegionName']):
    # Manipulation of x
    ...
    Town['RegionName'][i] = x

答案 1 :(得分:0)

.applylambdastr.split

一起使用

<强>演示:

import pandas as pd
import numpy as np

df = pd.DataFrame({"a":["Alabama[edit]", "Auburn (Auburn University)", "Jacksonville"]})
print(df["a"].apply(lambda x: np.nan if "[edit]" in x else x.split("(")[0].strip()))

<强>输出:

0             NaN
1          Auburn
2    Jacksonville
Name: a, dtype: object

答案 2 :(得分:0)

在可以避免的情况下,对pandas中的行进行迭代是不受欢迎的,因为它很慢。使用np.where

,这是解决问题的更快速的矢量化方法
Towns["RegionName"] = np.where(
    Towns["RegionName"].str.contains("\[edit\]"),
    np.nan,
    Towns["RegionName"].str.split("(\s)?\(", expand=True)[0]
)
print(Towns["RegionName"])
#0             NaN
#1          Auburn
#2        Florence
#3    Jacksonville
#Name: RegionName, dtype: object

np.where的第一个参数是一个条件。如果条件为True,则返回第二个参数。如果是False,则返回最后一个参数。为了替换(之后的所有内容,我使用了this similar question上发布的答案。