为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕丝7291255 2023-12-12 21:32:49
具有不完美数据的 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.nandf['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']})有什么实际的方法可以做到这一点?
查看完整描述

2 回答

?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

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 string

0      Smith      Mr     Smith     Mrs  Mr Smith & Mrs Smith

1  Longshore    Miss       NaN     NaN        Miss Longshore

2      Jones     NaN    Nguyen     NaN        Jones & Nguyen


查看完整回答
反对 回复 2023-12-12
?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

找到了一个将函数与 一起应用的解决方案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)


查看完整回答
反对 回复 2023-12-12
  • 2 回答
  • 0 关注
  • 121 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信