当前位置: 首页 > 知识库问答 >
问题:

如何根据另一列中的值将函数应用到熊猫中的一列?

顾嘉德
2023-03-14

提前感谢您的阅读。

我有一个数据帧:

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'中的每个元素,检查冲突='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)为代价。我假设其他行将保持不变;显然情况并非如此。

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

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

共有3个答案

施招
2023-03-14

您还可以使用所述的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
袁赞
2023-03-14

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

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)
燕雨石
2023-03-14

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

df.loc[df['Conflict'] == 'Match Conflict', 'Words'] = df.loc[df['Conflict'] == 'Match Conflict', 'Words'].apply(lambda x: func(x))
 类似资料:
  • 我经常处理格式不好的数据(即数字字段不一致等) 可能还有其他方法,我不知道,但我格式化数据帧中单个列的方法是使用函数并将该列映射到该函数。 问题:1-如果我有一个包含50列的数据框,并且想要将该格式应用于多个列,等等列1, 3, 5, 7, 9, 你能去吗 ...这样我可以格式化所有的数字列在一行?

  • 我有点被困在提取一个变量的值和另一个变量的条件上。例如,以下数据帧: 当时,如何获取的值?每次提取的值时,都会得到一个对象,而不是字符串。

  • 问题内容: 我有点被困在提取另一个变量的条件变量的值上。例如,以下数据框: 如何获得when的价值?每当我提取的值时,我都会得到一个对象,而不是字符串。 问题答案: 您可以用来获取满足条件的序列,然后获取第一个元素:

  • 我已准备好数据帧 我准备了 我想只覆盖Col2 row0,并尝试以下代码。 但是我得到了一个下面的错误。 索引错误:列表索引超出范围

  • 问题内容: 注意:为简单起见,我使用一个玩具示例,因为复制/粘贴数据帧在堆栈溢出中很困难(请让我知道是否有简便的方法来执行此操作)。 有没有一种方法可以将一个数据帧中的值合并到另一个数据帧中而无需获取_X,_Y列?我希望一列中的值替换另一列中的所有零值。 在上一篇文章中,我尝试了Combine_First和dropna(),但是这些都做不到。 我想用df2中的值替换df1中的零。此外,我希望根据d

  • 问题内容: 我有一个熊猫数据框。我想“落后”我的专栏之一。例如,这意味着将整个列“ gdp”上移一位,然后删除其余行底部的所有多余数据,以使所有列的长度再次相等。 无论如何要这样做? 问题答案: