【问题标题】:How can I slice elements of one Pandas dataframe column by different values?如何按不同的值对一个 Pandas 数据框列的元素进行切片?
【发布时间】:2020-12-19 16:00:44
【问题描述】:

我有一个“脏”的 csv 文件加载到 Pandas 数据框中。一列“名称”有时带有前缀(例如,实际名称前的“(3.)”)。

我了解此前缀的分类法,并且知道如何查找索引,我希望从该索引开始保留字符串的其余部分:

df["Indexes"]= df["Name"].str.find(')') 

但是:我如何减少对那个索引的限制?

例如,如果“Name”是“(3.) Peter”,我希望它变成“Peter”。

假设,我想使用 slice。我的问题是我需要切片的值每行不同。 -- 如果前缀的长度始终为 4,则下面将起作用,但它不是(有时没有前缀,有时长度为 5)。

pd.Series(df["Name"]).str.slice(4)

我该怎么做?

【问题讨论】:

  • 如果你知道模式,你可以使用.str.replace()。见regex-replace

标签: python pandas slice


【解决方案1】:

如果你知道模式,你可以使用extract 来获得干净的名字:

# The "dirty" CSV
string = """
(3.) Peter
(10.) David
Jane
(100.) Mary Wether
"""
df = pd.read_csv(StringIO(string), header=None, names=['Name'])

# Clean it
df['CleanName'] = df['Name'].str.extract(r'(\(.*\) )?(?P<Name>.+?)( \(.*\))?')['Name']

结果:

                 Name    CleanName
0          (3.) Peter        Peter
1         (10.) David        David
2                Jane         Jane
3  (100.) Mary Wether  Mary Wether

前往Regex 101 了解正则表达式模式的说明。

【讨论】:

  • 酷,工作!但是,当标识符出现在名称序列之后时,它是如何工作的呢?如果名字是Peter (3.),那么?=\(.+\) 对我有用。但是当(..) 完全丢失时,你怎么办呢?
  • 查看我编辑的答案。不过要小心:正则表达式并不是所有模式的答案。有时模式变得如此复杂,以至于您无法轻松地将它们全部放入单个正则表达式中。如果您发现正则表达式太难编写,则表明您需要将其分解为多个正则表达式或使用不同的处理策略
猜你喜欢
  • 2023-03-21
  • 2012-08-14
  • 2015-05-21
  • 1970-01-01
  • 2020-11-05
  • 2018-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多