Pandas / Python:根据另一列中的值设置一列的值

发布于 2021-01-29 19:21:43

我需要基于Pandas数据框中的另一列的值来设置一列的值。这是逻辑:

if df['c1'] == 'Value':
    df['c2'] = 10
else:
    df['c2'] = df['c3']

我无法做到这一点,我想要做的就是简单地创建一个具有新值的列(或更改现有列的值:任何一个都对我有用)。

如果我尝试运行上面的代码,或者将其编写为函数并使用apply方法,则会得到以下信息:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
关注者
0
被浏览
213
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    一种方法是将索引与配合使用.loc

    在没有示例数据框的情况下,我将在此处进行补充:

    import numpy as np
    import pandas as pd
    
    df = pd.DataFrame({'c1': list('abcdefg')})
    df.loc[5, 'c1'] = 'Value'
    
    >>> df
          c1
    0      a
    1      b
    2      c
    3      d
    4      e
    5  Value
    6      g
    

    假设您想 创建一个新列 c2c1除wherec1是之外, 该列 等效Value,在这种情况下,您希望将其分配给10:

    首先,您可以使用以下两行之一创建一个新的列c2,并将其设置为等效于c1,(它们本质上是做相同的事情):

    df = df.assign(c2 = df['c1'])
    # OR:
    df['c2'] = df['c1']
    

    然后,找到所有c1等于'Value'使用的索引.loc,并c2在这些索引处分配所需的值:

    df.loc[df['c1'] == 'Value', 'c2'] = 10
    

    最终,您将得到:

    >>> df
          c1  c2
    0      a   a
    1      b   b
    2      c   c
    3      d   d
    4      e   e
    5  Value  10
    6      g   g
    

    如果按照问题中的建议,有时您可能只是想 替换已有的列中的值 ,而不是创建一个新列,则跳过该列的创建,然后执行以下操作:

    df['c1'].loc[df['c1'] == 'Value'] = 10
    # or:
    df.loc[df['c1'] == 'Value', 'c1'] = 10
    

    给你:

    >>> df
          c1
    0      a
    1      b
    2      c
    3      d
    4      e
    5     10
    6      g
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看