猿问

如何使用其他列中有时包含 np.nan 的字符串填充 df 列,通过 elifs 迭代以返回适当

具有不完美数据的 df:


df = pd.DataFrame({'A Surname' : ['Smith', 'Longshore', 'Jones'], 

                       'A Title': ['Mr', 'Miss', np.nan],

                       'B Surname' : ['Smith', np.nan, 'Nguyen'], 

                       'B Title': ['Mrs', np.nan, np.nan]})

我正在寻找一列,该列包含适合在可能的情况下同时寻址 A 和 B 的字符串。如果有np.nan,则组合字段返回np.nan,并且它需要符合逻辑(例如,如果“B姓氏”是np.nan,则不要使用“B标题”),所以我需要一系列规则来确定最合适的组合。我不成功的做法:


def combined(x):

    full = df['A Title'] + ' ' & df['A Surname'] & ' & ' & df['B Title'] & ' ' & df['B Surname']

    no_title = df['A Surname'] & ' & ' & df['B Surname']

    # more combinations

    if full != np.nan:

        return full

    elif no_title != np.nan:

        return no_title

    # more elifs

    else:

        return df['A Surname']

        

df['combined string'] = np.nan

df['combined string'] = df['combined string'].apply(combined)

所需的输出如下所示:


desired_df = pd.DataFrame({'A Surname' : ['Smith', 'Longshore', 'Jones'], 

                       'A Title': ['Mr', 'Miss', 'Mr'],

                       'B Surname' : ['Smith', np.nan, 'Whatever'], 

                       'B Title': ['Mrs', np.nan, np.nan],

                       'combined string': ['Mr Smith & Mrs Smith', 'Miss Longshore', 'Jones & Whatever']})

有什么实际的方法可以做到这一点?


慕丝7291255
浏览 113回答 2
2回答

沧海一幻觉

Series.str.cat与这里一起使用Series.str.strip:a = df['A Title'].str.cat(df['A Surname'], sep=' ', na_rep='').str.strip()b = df['B Title'].str.cat(df['B Surname'], sep=' ', na_rep='').str.strip()df['combined string'] = a.str.cat(b, sep=' & ').str.strip(' &')print (df)   A Surname A Title B Surname B Title       combined string0      Smith      Mr     Smith     Mrs  Mr Smith & Mrs Smith1  Longshore    Miss       NaN     NaN        Miss Longshore2      Jones     NaN    Nguyen     NaN        Jones & Nguyen

qq_遁去的一_1

找到了一个将函数与 一起应用的解决方案axis=1,允许引用函数中的其他列。def combined(x):    if x['B Surname'] == '':        if x['A Title'] == '':            return x['A Surname']        else:            return x['A Title'] + ' ' + x['A Surname']    else:        if (x['A Title'] == '') or (x['B Title'] == ''):            return x['A Surname'] + ' & ' + x['B Surname']        else:            return x['A Title'] + ' ' +  x['A Surname'] + ' & ' + x['B Title'] + ' ' + x['B Surname']df = df.fillna('')df['combined string'] = df.apply(combined, axis=1)np.nan 值必须转换为空字符串,因为我无法弄清楚如何避免将 np.nans 转换为“nan”字符串或在函数内重新分配列值。注意df = df.fillna('')适用于整个 df。所有空字符串都可以通过以下方式转换为 nandf = df.replace(r'^\s*$', np.nan, regex=True)
随时随地看视频慕课网APP

相关分类

Python
我要回答