【问题标题】:How to populate new column based on values in other columns?如何根据其他列中的值填充新列?
【发布时间】:2020-02-04 07:12:18
【问题描述】:

我想根据列中是否有值来创建和填充一个新列。我有三列要比较,并且有一些订单我希望填充这些值。

假设我有 3 列 (ABC),我想用 A B 或 C 中的值填充新列 (Y),但我想对它们进行排名。因此,如果 A 列有一个值,我希望它优先于 B 和 C 列填充 Y 列。如果 B 有一个值,它优先于 C,而 C 列优先于任何内容。

我有什么:

A   B   C   Y        
1   NA  NA             
NA  2   NA
NA  3   NA
NA  NA  4        
5   NA  NA
6   6   NA
7   NA  NA
NA  NA  8
9   NA  9
10  10  10

我想要什么:

A   B   C   Y        
1   NA  NA  1           
NA  2   NA  2
NA  3   NA  3
NA  NA  4   4     
5   NA  NA  5
6   6   NA  6
7   NA  NA  7
NA  NA  8   8
9   NA  9   9
10  10  10 10

【问题讨论】:

    标签: python dataframe calculated-columns


    【解决方案1】:

    使用np.where() 进行矢量化方法。

    df['Y'] = np.where(df['A'] != np.nan, df['A'], df['B'])
    df['Y'] = np.where(df['B'] == np.nan, df['C'], df['Y'])
    

    由于您没有可以在您的问题中重复使用的 df,所以我只是编写了您需要的方法行。

    下次您提出问题时,请附上一段可用于测试可能答案的代码。欢迎加入社区:D

    如果 DataFrame 中的 NA 是字符串:

    上面的代码行不通,使用实际的字符串值来解析dataframe。

    df['Y'] = np.where(df['A'] != "NA", df['A'], df['B'])
    df['Y'] = np.where(df['B'] == "NA", df['C'], df['Y'])
    

    最后一点,另一个可能的输入是当所有三列都有 NA 值时。

    您的问题中没有指定,但如果您想捕获该实例,只需添加一个新行以检查您的 C 列中的值。

    然后在false返回值中,如果C值也是NA的话,放一个你要使用的值。

    【讨论】:

      【解决方案2】:

      好问题!我认为有很多方法可以解决这个问题。我立即想到的一个是使用一个循环,将每一行转换为一个系列,然后用该系列中不是“NA”值的第一个条目填充 Y 列。通用代码如下所示:

      for row in DF: 
           temp_series = pd.Series(row)
           for entry in temp_series:
                if entry==NA:
                      continue
                else:
                      df.iloc[row,3] = entry #3 = Y col index
      

      同样,这不是一个精确的复制和粘贴解决方案,但这种方法应该可以满足您的需求。祝你好运,编码愉快!

      编辑:从一个新用户到另一个新用户,欢迎加入社区!

      【讨论】:

        【解决方案3】:

        你可以使用pandas来构造数据结构,然后仔细使用apply()函数可以帮你得到你想要的转换。

        import pandas as pd
        import math
        
        data = (
          [1,    None, None,],
          [None, 2   , None,],
          [None, 3   , None,],
          [None, None, 4,   ],
          [5   , None, None,],
          [6   , 6   , None,],
          [7   , None, None,],
          [None, None, 8,   ],
          [9   , None, 9,   ],
          [10,   10,   10,  ],
        )
        
        df = pd.DataFrame(columns=('A', 'B', 'C'))
        
        # Load in data
        for row in data:
          df = df.append(pd.Series(row, index=df.columns), ignore_index=True)
        print(df)
        
        def calc_y(row):
          for item in row:
            if not math.isnan(item): 
              return item
        
        df['Y'] = df.apply(calc_y, axis=1)
        
        print(df)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-06-19
          • 1970-01-01
          • 1970-01-01
          • 2020-03-16
          • 2021-12-10
          • 1970-01-01
          • 2019-06-06
          • 1970-01-01
          相关资源
          最近更新 更多