条件编辑Pandas DataFrame中的字符串

时间:2016-08-28 09:25:00

标签: python regex pandas

我正在学习Pandas并且有一个字符串的DataFrame看起来有点像这样:

df = pd.DataFrame([['Apple', 'Med6g7867'], ['Orange', 'Med7g8976'], ['Banana', 'Signal'], ['Peach', 'Med8g8989'], ['Mango', 'Possible result %gggyy']], columns=['A', 'B'])
df
    A       B
0   Apple   Med6g7867
1   Orange  Med7g8976
2   Banana  Signal
3   Peach   Med8g8989
4   Mango   Possible result %gggyy

注意列B有两种类型的值,可以是MedXgXXXX形式的唯一标识符,也可以是描述性字符串。我想做两件相关的事情。

  1. 将具有唯一标识符的B的所有值替换为NaN
  2. 保留描述性字符串,但截断任何带有%符号的字符串,以便我只保留%符号之前的字符串。
  3. 我想要一张这样的表:

        A       B
    0   Apple   NaN
    1   Orange  NaN
    2   Banana  Signal
    3   Peach   NaN
    4   Mango   Possible result
    

    目前我可以像这样对表进行子集化:

    df[df['B'].str.contains("Med")]
    df[df['B'].str.contains("%")]
    

    但我尝试replace()没有实现允许我这样做。

    任何帮助表示感谢。

2 个答案:

答案 0 :(得分:2)

你可以像这样两次申请替换:

In [460]: df
Out[460]: 
        A                       B
0   Apple               Med6g7867
1  Orange               Med7g8976
2  Banana                  Signal
3   Peach               Med8g8989
4   Mango  Possible result %gggyy

In [461]: df.replace(r'Med\dg\d{4}', np.nan, regex=True).replace(r'\s+%.*', '', regex=True)
Out[461]: 
        A                B
0   Apple              NaN
1  Orange              NaN
2  Banana           Signal
3   Peach              NaN
4   Mango  Possible result

答案 1 :(得分:2)

import pandas as pd
df = pd.DataFrame([['Apple', 'Med6g7867'],
                   ['Orange', 'Med7g8976'],
                   ['Banana', 'Signal'],
                   ['Peach', 'Med8g8989'],
                   ['Mango', 'Possible result %gggyy']],
                  columns=['A', 'B'])

df['B'] = df['B'].str.extract(r'(?:^Med.g.{4})|([^%]+)', expand=False)
print(df)

产量

        A                 B
0   Apple               NaN
1  Orange               NaN
2  Banana            Signal
3   Peach               NaN
4   Mango  Possible result 

正则表达式模式具有以下含义:

(?:            # start a non-capturing group
  ^            # match the start of the string
  Med          # match the literal string Med
  .            # followed by any character
  g            # a literal g
  .{4}         # followed by any 4 characters
)              # end the non-capturing group
|              # OR
(              # start a capturing group
  [^%]+        # 1-or-more of any characters except %
)              # end capturing group

如果B列中的值以表单的唯一标识符开头 MedXgXXXX然后匹配非捕获组。自str.extract以来 仅返回捕获组的值,返回的Series str.extract在此位置会有NaN

如果匹配捕获组,则str.extract将返回 匹配值。