首页 > 解决方案 > 如果数据框中的列为空,如何创建条件子句?

问题描述

我有一个看起来像这样的df:

fname                   lname
joe                      smith
john smith      
jane@jane.com            
jacky /jax               jack
a@a.com                  non
john (jack)              smith
Bob J. Smith

我想创建一个逻辑,说如果lname是空的,如果有两个OR三个字符串fname分开第二个字符串OR第三个字符串并将其推入lname列。如果电子邮件地址保持fname原样,并且fname列中有斜杠或括号,并且保持原样没有值lname

新的df:

fname                   lname
    joe                      smith
    john                     smith
    jane@jane.com            
    jacky /jax               jack
    a@a.com                  non
    john (jack)              smith
    Bob J.                   smith

到目前为止分隔两个字符串的代码:

df[['lname']] = df['name'].loc[df['fname'].str.split().str.len() == 2].str.split(expand=True)

标签: pythonpython-3.xpandas

解决方案


使用以下示例数据框:

df = pd.DataFrame({'fname': ['joe', 'john smith', 'jane@jane.com', 'jacky /jax', 'a@a.com', 'john (jack)', 'Bob J. Smith'],
     'lname': ['smith', '', '', 'jack', 'non', 'smith', '']})

您可以使用np.where()

conditions = (df['lname']=='') & (df['fname'].str.split().str.len()>1)

df['lname'] = np.where(conditions, df['fname'].str.split().str[-1].str.lower(), df['lname'])

产量:

           fname  lname
0            joe  smith
1     john smith  smith
2  jane@jane.com       
3     jacky /jax   jack
4        a@a.com    non
5    john (jack)  smith
6   Bob J. Smith  smith

要从填充fname了其列的行的列中删除最后一个字符串:lname

df['fname'] = np.where(conditions, df['fname'].str.split().str[:-1].str.join(' '), df['fname'])

产量:

           fname  lname
0            joe  smith
1           john  smith
2  jane@jane.com       
3     jacky /jax   jack
4        a@a.com    non
5    john (jack)  smith
6         Bob J.  smith

推荐阅读