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

2024-10-02 00:41:49 发布

您现在位置:Python中文网/ 问答频道 /正文

提前感谢您的阅读。在

我有一个数据帧:

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'中的值应用一些函数。在

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

^{pr2}$

我写道:

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,但我没能做到这一点,这是我能想到的最好的办法。在

非常感谢你的帮助。谢谢。在


Tags: 函数nonedfconfmatchsecnanlevel
3条回答

您还可以使用where,如您所述

condition = df.Conflict != 'Match Conflict'
df['Words'] = df.Words.where(condition, None)

         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

您应该重写函数以处理所有行:

def func(x, match):
    if x['Conflict'] == match:
        return None
    return x['Words']

df['Words'] = df.apply(lambda row: func(row, 'Match Conflict'), axis=1)

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

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

enter image description here

相关问题 更多 >

    热门问题