我要根据一列中是否有值来制作并填充一个新值。我有三列要比较,并且有一些我希望将值填充的顺序。
假设我有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
答案 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)