【问题标题】:Pandas create new column based on first unique values of existing columnPandas 根据现有列的第一个唯一值创建新列
【发布时间】:2019-04-17 18:07:06
【问题描述】:

我正在尝试向数据框中添加一个新列,其中仅包含现有列中的唯一值。新列中的行数可能会减少,其中 np.nan 值可能会出现重复项。

import pandas as pd
import numpy as np

df = pd.DataFrame({'a':[1,2,3,4,5], 'b':[3,4,3,4,5]})
df

    a   b
0   1   3
1   2   4
2   3   3
3   4   4
4   5   5

目标:

    a   b   c
0   1   3   3
1   2   4   4
2   3   3   nan
3   4   4   nan
4   5   5   5

我试过了:

df['c'] = np.where(df['b'].unique(), df['b'], np.nan)

它抛出:operands could not be broadcast together with shapes (3,) (5,) ()

【问题讨论】:

    标签: python python-3.x pandas numpy unique


    【解决方案1】:

    mask + duplicated

    您可以使用 Pandas 方法来屏蔽系列:

    df['c'] = df['b'].mask(df['b'].duplicated())
    
    print(df)
    
       a  b    c
    0  1  3  3.0
    1  2  4  4.0
    2  3  3  NaN
    3  4  4  NaN
    4  5  5  5.0
    

    【讨论】:

      【解决方案2】:

      将duplicated 与np.where 一起使用:

      df['c'] = np.where(df['b'].duplicated(),np.nan,df['b'])
      

      或者:

      df['c'] = df['b'].where(~df['b'].duplicated(),np.nan)
      

      print(df)
         a  b    c
      0  1  3  3.0
      1  2  4  4.0
      2  3  3  NaN
      3  4  4  NaN
      4  5  5  5.0
      

      【讨论】:

        【解决方案3】:

        ppg 写道:

        df['c'] = df['b'].mask(df['b'].duplicated())
        
        print(df)
        
           a  b    c
        0  1  3  3.0
        1  2  4  4.0
        2  3  3  NaN
        3  4  4  NaN
        4  5  5  5.0
        

        我喜欢代码,但最后一列也应该给出 NaN

            0  1  3  3.0
            1  2  4  4.0
            2  3  3  NaN
            3  4  4  NaN
            4  5  5  NaN
        

        【讨论】:

        • 我不明白你的答案/观点。你能进一步解释一下吗?
        • 5 应该是 5.0,而不是你的帖子建议的 NaN。 5 是 5 的第一个实例,所以不会是 NaN'd
        猜你喜欢
        • 1970-01-01
        • 2023-02-23
        • 2020-08-18
        • 2020-04-16
        • 1970-01-01
        • 2018-10-07
        • 2021-02-15
        • 2018-08-25
        • 2018-10-09
        相关资源
        最近更新 更多