Python 基于带或的正则表达式拆分DataFrame列

Python 基于带或的正则表达式拆分DataFrame列,python,regex,pandas,split,Python,Regex,Pandas,Split,我有一个数据框,其中有几列用户信息,“联系人1”和“联系人2” 联系人1 联系人2 1234567891 1234567891 没有一个 12345678 12345678 没有一个 12345678 1234567891 没有一个 1234567891 12345678 没有一个 1234567 1234567891 没有一个 1234567891 12345678 123456789 12345678911 没有一个 没有一个 没有一个 使用str.extract: df[“联系人2”]=n

我有一个数据框,其中有几列用户信息,“联系人1”和“联系人2”

联系人1 联系人2 1234567891 1234567891 没有一个 12345678 12345678 没有一个 12345678 1234567891 没有一个 1234567891 12345678 没有一个 1234567 1234567891 没有一个 1234567891 12345678 123456789 12345678911 没有一个 没有一个 没有一个
使用
str.extract

df[“联系人2”]=np.where(df[“联系人2”].isnull(),
df[“Contact 1”].str.extract(r'^\d{8,10}(\d{8,10})$),
df[“联系人2”])
我们还需要更新第一列:

df[“联系人1”]=df[“联系人1”].str.replace(r'^(\d{8,10})\d{8,10}$',r'\1')

使用
str.extract

df[“联系人2”]=np.where(df[“联系人2”].isnull(),
df[“Contact 1”].str.extract(r'^\d{8,10}(\d{8,10})$),
df[“联系人2”])
我们还需要更新第一列:

df[“联系人1”]=df[“联系人1”].str.replace(r'^(\d{8,10})\d{8,10}$',r'\1')

如果您对非正则表达式解决方案感兴趣:

创建符合条件的掩码或行

m = df['Contact 1'].str.split().apply(lambda x: all([len(n) in [8,10] for n in x]))
使用拆分/扩展的值更新df

df.update(df.loc[m]['Contact 1'].str.split(expand=True).rename(columns={0:'Contact 1',
                                                                        1:'Contact 2'}), overwrite=True)

如果您对非正则表达式解决方案感兴趣:

创建符合条件的掩码或行

m = df['Contact 1'].str.split().apply(lambda x: all([len(n) in [8,10] for n in x]))
使用拆分/扩展的值更新df

df.update(df.loc[m]['Contact 1'].str.split(expand=True).rename(columns={0:'Contact 1',
                                                                        1:'Contact 2'}), overwrite=True)


这不会产生所需的输出。@Chris现在正在使用
np。其中
仅为
联系人2
分配一个值,如果该值尚未为空。仍然需要修复第一列!非常感谢。我刚刚试过,它适用于每一行,除了有“Contact 2”值的行,在该行中它被覆盖为nan。我不知道为什么会这样,因为逻辑似乎很好。很抱歉,我忘了提到我的真实数据帧没有值,而不是空白。因此我将其更改为None,如下所示
df[“Contact 2”]=np.where(df[“Contact 2”]=None,df[“Contact 1”].str.extract(r'^\d{8,10}(\d{8,10})$),df[“Contact 2”]
,但它不起作用。@user16170404 Use
isnull()
在列上检查
None
。这不会产生所需的输出。@Chris现在正在使用
np。其中
仅为
联系人2指定一个值,如果它不是空的。仍然需要修复第一列!非常感谢。我刚刚试过,它适用于每一行,除了有“Contact 2”值的行,在该行中它被覆盖为nan。我不知道为什么会这样,因为逻辑似乎很好。很抱歉,我忘了提到我的真实数据帧没有值,而不是空白。因此我将其更改为None,如下所示
df[“Contact 2”]=np.where(df[“Contact 2”]=None,df[“Contact 1”].str.extract(r'^\d{8,10}(\d{8,10})$),df[“Contact 2”]
,但它不起作用。@user16170404 Use
isnull()
在列上检查
。请解释行
12345678 1234567891
的Contact 2列在处理后是如何获得值的?是的。由于12345678 1234567891由8位或10位数字(在本例中为8位)和空格组成,然后是由8位或10位数字(在本例中为10位)组成的数字,第二个数字应拆分为“联系人2”列。请您解释一下行
12345678 1234567891
的联系人2列在处理后是如何获得值的?是的。由于12345678 1234567891由8位或10位数字(在本例中为8位)和空格组成,然后由8位或10位数字(在本例中为10位)组成,因此第二个数字应拆分为“联系人2”列谢谢!这对于我的小数据帧非常有效,但是当我尝试在75000行的真实数据帧上运行您的第一行代码时,我得到了一个错误“TypeError:“NoneType”object is not iterable”,这很奇怪,因为我们刚刚用小数据帧证明了它对无值有效.str.split()!!非常感谢。这对于我的小数据帧非常有效,但是当我尝试在75000行的真实数据帧上运行您的第一行代码时,我得到了一个错误“TypeError:“NoneType”object is not iterable”,这很奇怪,因为我们刚刚用小数据帧证明了它对无值有效.str.split()!!