【问题标题】:Removal of Dash/Dots in a string column in pandas and replace it with Null删除 Pandas 中字符串列中的 Dash/Dots 并将其替换为 Null
【发布时间】:2018-11-17 11:10:04
【问题描述】:

我有以下数据框。其中列“col1”是一个字符串列,由文本、特殊字符、破折号、圆点和日期组成。

我想替换col1包含破折号和/或圆点的所有条目。它们应替换为单词null。请注意col1 中的日期也包含破折号或圆点。这些我不想替换。

** 输入:**

col1 

----
-
---
02-05-2018 meet with bm sir and service manager 
02-05-2018 meet with xyz sir for HA 
02-05-2018 meet with pqr sir for PAI 
04-12-2107
-
.
...
03.08.2018

期望的输出:

Col1

null
null
null
02-05-2018 meet with bm sir and service manager 
02-05-2018 meet with xyz sir for HA 
02-05-2018 meet with pqr sir for PAI 
04-12-2107
null
null
null
03.08.2018

【问题讨论】:

  • 我已经清楚地提出了这个问题并给出了相关的例子。 @Scott Boston 也提出了解决方案,不幸的是它不起作用。
  • 解决方案很难找到,并不能说明它是无用的。请询问我是否不清楚,而不是在没有提供解决方案的情况下简单地标记它。

标签: regex python-3.x pandas regexp-replace


【解决方案1】:

maskcontains 与正则表达式一起使用:

df.mask(df.col1.str.contains(r'^[\.|\-]'))

输出:

                                              col1
0                                              NaN
1                                              NaN
2                                              NaN
3  02-05-2018 meet with bm sir and service manager
4              02-05-2018 meet with xyz sir for HA
5             02-05-2018 meet with pqr sir for PAI
6                                       04-12-2107
7                                              NaN
8                                              NaN
9                                              NaN

使用附加列更新以显示更改。

df['col11'] = df.mask(df.col1.str.contains(r'^[\.|\-]'))

print(df)

输出:

                                               col1                                            col11
0                                              ----                                              NaN
1                                                 -                                              NaN
2                                               ---                                              NaN
3   02-05-2018 meet with bm sir and service manager  02-05-2018 meet with bm sir and service manager
4               02-05-2018 meet with xyz sir for HA              02-05-2018 meet with xyz sir for HA
5              02-05-2018 meet with pqr sir for PAI             02-05-2018 meet with pqr sir for PAI
6                                        04-12-2107                                       04-12-2107
7                                                 -                                              NaN
8                                                 .                                              NaN
9                                               ...                                              NaN
10                                       03.08.2018                                       03.08.2018

【讨论】:

  • 谢谢,我不知道是谁投了反对票。我尝试了代码,它不起作用。它用数字代替
  • 用数字代替???此语句中没有替换,这里我们掩盖了 contains 返回 True 的位置。并且,如果 . 以外的任何字符,包含返回 true。或 - 存在于字符串中。
  • 它基本上替换了我的数据框中“第一列”中的值,即数字。下面是我执行的代码 df['bn_note_text'] = df.mask(df.bn_note_text.str.contains(r'^[\.|\-]')) bn_note_text 是我需要应用正则表达式的列名跨度>
  • 好吧,我很困惑。在语句之前打印 df.head(10) 运行您在此处的语句并在语句之后打印 df.head(10)。
  • df['bn_note_text'].head() 输出[757]:0 63889 1 15351 2 15351 3 15351 4 34237
【解决方案2】:

使用/^[-.]+$/gm 仅匹配包含 .或 -

如果你想保留只包含点和破折号的线条,你可以使用/^([-.])\1*$/gm

【讨论】:

    猜你喜欢
    • 2021-01-21
    • 1970-01-01
    • 2014-02-22
    • 2018-12-21
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    • 2022-11-20
    相关资源
    最近更新 更多