【问题标题】:Python: create a new column from existing columnsPython:从现有列创建新列
【发布时间】:2015-07-27 17:53:15
【问题描述】:

我正在尝试基于两列创建一个新列。假设我想创建一个新列 z,当它没有丢失时它应该是 y 的值,当 y 确实丢失时它应该是 x 的值。所以在这种情况下,我希望 z 是[1, 8, 10, 8]

   x   y
0  1 NaN
1  2   8
2  4  10
3  8 NaN

【问题讨论】:

    标签: python pandas missing-data calculated-columns


    【解决方案1】:

    我不确定我是否理解这个问题,但这会是您要找的吗?

    "if y[i]" 如果值为 none,将跳过。

    for i in range(len(x));
        if y[i]:
            z.append(y[i])
        else:
            z.append(x[i])
    

    【讨论】:

    • 它不起作用。出于某种原因,它永远不会遇到 else 子句。
    【解决方案2】:

    假设 DataFrame 被称为df。先复制y列。

    df["z"] = df["y"].copy()
    

    然后将z的nan位置设置为x中nans在z中的位置。

    import numpy as np
    df.z[np.isnan(df.z)]=df.x[np.isnan(df.z)]
    
    
    >>> df 
       x   y   z
    0  1 NaN   1
    1  2   8   8
    2  4  10  10
    3  8 NaN   8
    

    【讨论】:

      【解决方案3】:

      使用np.where:

      In [3]:
      
      df['z'] = np.where(df['y'].isnull(), df['x'], df['y'])
      df
      Out[3]:
         x   y   z
      0  1 NaN   1
      1  2   8   8
      2  4  10  10
      3  8 NaN   8
      

      这里它使用布尔条件,如果为真则返回df['x'],否则返回df['y']

      【讨论】:

      • 谢谢!很有帮助~
      • 不用担心,如果您发现这个或另一个答案完全回答了您的问题,那么请接受一个答案,答案的左上角会有一个空的勾号,这样答案就不会保留未答复
      • 很好,很有帮助
      【解决方案4】:

      您可以将apply 与选项axis=1 一起使用。那么你的解决方案就非常简洁了。

      df[z] = df.apply(lambda row: row.y if pd.notnull(row.y) else row.x, axis=1)
      

      【讨论】:

        【解决方案5】:

        update 方法几乎就是这样做的。唯一需要注意的是 update 会在原地执行此操作,因此您必须先创建一个副本:

        df['z'] = df.x.copy()
        df.z.update(df.y)
        

        在上面的示例中,您从x 开始,并将每个值替换为来自y 的对应值,只要新值不是NaN

        【讨论】:

          【解决方案6】:

          新列 'z' 使用 df['z'] = df['y'] 从列 'y' 获取其值。这会带来缺失值,因此请使用fillna 使用列'x' 填充它们。链接这两个动作:

          >>> df['z'] = df['y'].fillna(df['x'])
          >>> df
             x   y   z
          0  1 NaN   1
          1  2   8   8
          2  4  10  10
          3  8 NaN   8
          

          【讨论】:

          • 太酷了!不知道从这一个问题中学到了很多东西!一路走好~~
          猜你喜欢
          • 2021-01-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-09-24
          • 1970-01-01
          • 2019-12-27
          • 2020-05-10
          • 1970-01-01
          相关资源
          最近更新 更多