我有一个以下列方式组织的数据框
var1 var2 var3 var4
0 A 23 B 7
1 B 13 C 4
2 C 12 A 11
3 A 5 C 15
我现在想要创建一个新变量(列)var5,如果var1 == A则取var2的值,如果var3 == A则取var4的值。为简单起见,var1和var3都不能同时具有值A.如果var1或var3都没有值A,那么我想要NaN。也就是说,此示例中的结果将是:
var1 var2 var3 var4 var5
0 A 23 B 7 23
1 B 13 C 4 NaN
2 C 12 A 11 11
3 A 5 C 15 5
如何实现这一目标?
答案 0 :(得分:3)
选项1
听起来你可以使用np.where
-
i = df.var1 == 'A'
j = df.var3 == 'A'
df['var5'] = np.where(i, df.var2, np.where(j, df.var4, np.NaN))
df
var1 var2 var3 var4 var5
0 A 23 B 7 23.0
1 B 13 C 4 NaN
2 C 12 A 11 11.0
3 A 5 C 15 5.0
选项2
另一种选择是np.select
-
df['var5'] = np.select([i, j], [df.var2, df.var4], default=np.nan)
df
var1 var2 var3 var4 var5
0 A 23 B 7 23.0
1 B 13 C 4 NaN
2 C 12 A 11 11.0
3 A 5 C 15 5.0
注意,i
和j
与选项1 的代码清单中定义的变量相同。
选项3
pd.Series.mask
/ where
df.var2.mask(~i, df.var4.mask(~j, np.nan))
0 23.0
1 NaN
2 11.0
3 5.0
Name: var2, dtype: float64
答案 1 :(得分:1)
抛弃我简单的但可能不是快速的答案。 (如果是为了表现,请参阅评论和其他答案。
df = pd.DataFrame([['A', 23, 'B', 7], ['B', '13', 'C', 4],
['c', 12, 'A', 11], ['A', 5, 'C', 15]],
columns=['v1', 'v2', 'v3', 'v4'])
def get_val(row):
if row.v1 == 'A':
return row.v2
elif row.v3 == 'A':
return row.v4
else:
return np.nan
df["v5"] = df.apply(get_val, axis=1)
代码所做的是它定义了一个函数来根据每一行返回一个值。使用apply
功能。