我正在努力确定为什么我的分割功能和代码不起作用。我有一个这样的专栏 -
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的
奥本
佛罗伦萨
杰克逊维尔
。
。
。
需要清理的是 - 删除括号内的整个内容,所需内容和括号之间可能有空格,因此必须考虑到这一点。
请指教。
答案 0 :(得分:2)
您需要将值设置回列表项
for i, x in enumerate(Town['RegionName']):
# Manipulation of x
...
Town['RegionName'][i] = x
答案 1 :(得分:0)
将.apply
与lambda
和str.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上发布的答案。