微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何根据另一列中的值将函数应用于Pandas中的列?

提前感谢您的阅读.

我有一个数据帧:

df = pd.DataFrame({'Words':[{'Sec': ['level']},{'Sec': ['levels']},{'Sec': ['level']},{'Und': ['ba ']},{'Pro': ['conf'],'ProAbb': ['cth']}],'Conflict':[None,None,None,None,'Match Conflict']})


         Conflict                                     Words
0            None                      {u'Sec': [u'level']}
1            None                     {u'Sec': [u'levels']}
2            None                      {u'Sec': [u'level']}
3            None                        {u'Und': [u'ba ']}
4  Match Conflict  {u'ProAbb': [u'cth'], u'Pro': [u'conf']}

我想应用一个例程,对于’Words’中的每个元素,检查Conflict =’Match Conflict’,如果是,则将一些函数应用于’Words’中的值.

例如,使用以下占位符函数

def func(x):
    x = x.clear()
    return x

我写:

df['Words'] = df[df['Conflict'] == 'Match Conflict']['Words'].apply(lambda x: func(x))

我的预期输出是:

         Conflict                                     Words
0            None                      {u'Sec': [u'level']}
1            None                     {u'Sec': [u'levels']}
2            None                      {u'Sec': [u'level']}
3            None                        {u'Und': [u'ba ']}
4  Match Conflict                                        None

相反,我得到:

         Conflict Words
0            None   NaN
1            None   NaN
2            None   NaN
3            None   NaN
4  Match Conflict  None

函数仅应用于具有Conflict =’Match Conflict’的行,但代价是其他行(全部变为None.我假设其他行保持不变;显然情况并非如此.

你能解释一下如何在不丢弃Words列中的所有信息的情况下实现我想要的输出吗?我相信答案可能在于np.where,但我无法做到这一点,这是我能想到的最好的.

任何帮助非常感谢.谢谢.

解决方法:

您可以尝试仅使用.loc更新与条件匹配的行:

df.loc[df['Conflict'] == 'Match Conflict', 'Words'] = df.loc[df['Conflict'] == 'Match Conflict', 'Words'].apply(lambda x: func(x))

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐