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