我正在学习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形式的唯一标识符,也可以是描述性字符串。我想做两件相关的事情。
我想要一张这样的表:
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()
没有实现允许我这样做。
任何帮助表示感谢。
答案 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
将返回
匹配值。