如何根据其他列中的值填充新列?

时间:2019-10-06 23:11:12

标签: python dataframe calculated-columns

我要根据一列中是否有值来制作并填充一个新值。我有三列要比较,并且有一些我希望将值填充的顺序。

假设我有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

3 个答案:

答案 0 :(得分: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是一个字符串:

上面的代码不起作用,使用实际的字符串值来解析数据帧。

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

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

您的问题中未指定,但是如果要捕获该实例,只需在C列中添加新行以检查值即可。

然后在错误的返回值中,如果C的值也为NA,则放置一个要使用的值。

答案 1 :(得分:0)

好问题!我认为有很多方法可以解决这个问题。我马上想到的是使用一个循环,将每一行转换为一个序列,然后用该序列中的第一个条目(不是“ 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

同样,这不是一个精确的粘贴解决方案,但是这种方法应该可以为您提供所需的东西。祝你好运,编码愉快!

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

答案 2 :(得分:0)

您可以使用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)