Python pandas str.extract 从多列
Posted
技术标签:
【中文标题】Python pandas str.extract 从多列【英文标题】:Python pandas str.extract from multiple columns 【发布时间】:2019-08-07 01:34:15 【问题描述】:我正在尝试使用 Pandas 和 str.extract 将字符串模式从多个列中提取到单个结果列中。
我的示例数据框如下。
field1 field2
ab1234 ab1234
ac1234
qw45 rt23
c1234b cb1234
cv 1234dd
...
我想从任一列(在本例中为 field1 和 field2)中提取“1234”(编辑:任何 4 位整数,而不仅仅是“1234”)到一个新的结果列中,以在下面获得所需的结果
field1 field2 result
ab1234 ab1234 1234
ac1234 1234
qw45 rt23
c1234b cb1234 1234
cv 1234dd 1234
...
我正在尝试使用 pandas str.extract 来获得我想要的结果,但是,我没有成功,如下所示。
import pandas as pd
import numpy as np
import re
df = pd.DataFrame('field1':['ab1234','ac1234','qw45', 'c1234b', 'cv'],
'field2':['ab1234','','rt23','cb1234', '1234dd'])
df['result'] = df[['field1', 'field2']].apply(lambda x:
x.str.extract(r'(\d4)', flags = re.IGNORECASE, expand =
False)).any(axis=1)
print(df)
以上只返回布尔结果。我想知道是否可以将以上内容转换为返回实际模式,还是有其他方法可以解决这个问题?
非常感谢您。
编辑:对不起,我应该提到该模式可以是任何 4 位整数,而不仅仅是“1234”。因此,我希望结果列返回这 4 位数字。
【问题讨论】:
【参考方案1】:IIUC
df['New']=df.apply(','.join,axis=1).str.extract(r'(\d4)', expand =
False).fillna('')
df
field1 field2 New
0 ab1234 ab1234 1234
1 ac1234 1234
2 qw45 rt23
3 c1234b cb1234 1234
4 cv 1234dd 1234
【讨论】:
【参考方案2】:您快到了,您可以执行以下操作。
我们可以使用for loop
两次应用str.extract
来创建两个临时列。
然后用fillna
创建最后一列result
。
cols = ['field1', 'field2']
n=1
for col in cols:
df['result'+str(n)] = df[col].str.extract('([0-9]4)')
n += 1
df['result'] = df.result1.fillna(df.result2).fillna('')
df.drop(['result1', 'result2'], inplace=True, axis=1)
print(df)
field1 field2 result
0 ab1234 ab1234 1234
1 ac1234 1234
2 qw45 rt23
3 c1234b cb1234 1234
4 cv 1234dd 1234
【讨论】:
非常感谢二凡,这很好用,从没想过使用.fillna。只是想知道,如果您仍然建议将 .fillna 用于更复杂的条件,例如超过 2 个字段来提取或应用多个模式?再次感谢二凡。 @nqcthanh 使用正则表达式可以提取多个模式,但这需要更复杂的正则表达式代码。我建议为此发布另一个问题。以上是关于Python pandas str.extract 从多列的主要内容,如果未能解决你的问题,请参考以下文章
str.extract 在 pandas DataFrame 中从后面开始
pandas - series.str.extract 正在删除捕获组的第一个字符
如何为 Pandas RE .str.extract() 使用 RE OR Operand
pandas的分列之不规则字符串及str.extract()