如果正则表达式不适合,则在extract()之后保留值。Pandas

2024-10-04 03:16:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我的意见:

df=pd.DataFrame({'A':['adam','monica','joe doe','michael mo'], 'B':['david','valenti',np.nan,np.nan]})
print(df)
            A        B
0        adam    david
1      monica  valenti
2     joe doe      NaN
3  michael mo      NaN

我需要将空格后的字符串提取到第二列,但在使用代码时:

df['B'] = df['A'].str.extract(r'( [a-zA-Z](.*))')
print(df)
            A     B
0        adam   NaN
1      monica   NaN
2     joe doe   doe
3  michael mo    mo

我在未提取值的每个单元格中接收NaN。如何避免? 我尝试使用以下代码仅从存在NaN的行中提取:

df.loc[df.B.isna(),'B'] = df.loc[df.B.isna(),'A'].str.extract(r'( [a-zA-Z](.*))')

ValueError: Incompatible indexer with DataFrame

预期产量:

            A     B
0        adam   david
1      monica   valenti
2     joe doe   doe
3  michael mo    mo

Tags: 代码dataframedfnpnanmonicamodavid
2条回答

你的方法不起作用,因为你陈述的左右两边形状不同。左边部分的形状为(2,),右边部分的形状为(2, 2)

df.loc[df.B.isna(),'B']

退货:

2    NaN
3    NaN

你想在这里填上:

df.loc[df.B.isna(),'A'].str.extract(r'( [a-zA-Z](.*))')

退货:

      0   1
2   doe  oe
3    mo   o

您可以采用列1,然后它将具有与左侧部分相同的形状(2,),并适合:

df.loc[df.B.isna(),'A'].str.extract(r'( [a-zA-Z](.*))')[1]

退货:

2    oe
3     o 

我认为解决方案应该简化-按空格拆分,得到第二个列表并传递给^{}函数:

df['B'] = df['B'].fillna(df['A'].str.split().str[1])
print (df)
            A        B
0        adam    david
1      monica  valenti
2     joe doe      doe
3  michael mo       mo

细节

print (df['A'].str.split().str[1])
0    NaN
1    NaN
2    doe
3     mo
Name: A, dtype: object

您的解决方案应该更改:

df['B'] = df['A'].str.extract(r'( [a-zA-Z](.*))')[0].fillna(df.B)
print (df)
            A        B
0        adam    david
1      monica  valenti
2     joe doe      doe
3  michael mo       mo

更好的解决方案是将regex和expand=False更改为Series

df['B'] = df['A'].str.extract(r'( [a-zA-Z].*)', expand=False).fillna(df.B)
print (df)
            A        B
0        adam    david
1      monica  valenti
2     joe doe      doe
3  michael mo       mo

细节

print (df['A'].str.extract(r'( [a-zA-Z].*)', expand=False))
0     NaN
1     NaN
2     doe
3      mo
Name: A, dtype: object

编辑:

对于从第一列中提取值,最简单的是使用:

df1 = df['A'].str.split(expand=True)

df['A'] = df1[0]
df['B'] = df['B'].fillna(df1[1])
print (df)
         A        B
0     adam    david
1   monica  valenti
2      joe      doe
3  michael       mo

相关问题 更多 >