Python 基于数据帧中的信息在数据帧中创建变量
我有一个按以下方式组织的数据帧Python 基于数据帧中的信息在数据帧中创建变量,python,pandas,Python,Pandas,我有一个按以下方式组织的数据帧 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或var
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
如何才能做到这一点呢?抛开我简单但可能不是很快的答案。(如果以性能为目标,请参阅注释和其他答案
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
选项1
听起来您可以使用
np。其中
用于此-
i = df.var1 == 'A'
j = df.var3 == 'A'
选项2
另一种选择是
np。选择-
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
/其中
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
apply
作为一个方便的函数很好,但是如果你想要性能,你真的想看看其他的选择。例如,你只需删除apply并在这个函数上使用np.vectorize
,就可以获得巨大的加速,这仅仅是因为减少了开销。@cᴏʟᴅsᴘᴇᴇᴅ 由于函数开销?是的。除了作为一个美化的循环,apply还有许多其他开销,以至于一个简单的for循环可能更快(因为它以C速度运行)。@Cᴏʟᴅsᴘᴇᴇᴅ 谢谢你提供的信息。从你那里学到了很多很酷的技巧。@cᴏʟᴅsᴘᴇᴇᴅ 哦!谢谢你,Q_QGreat,前两个选项完全符合预期。作为一个熊猫初学者,我不确定我是否完全理解第三个选项。@matnor我也不知道……现在你知道我的秘密了;-p
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