根据数据框中的信息在Pandas数据框中创建变量

时间:2017-12-29 19:00:10

标签: 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或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

如何实现这一目标?

2 个答案:

答案 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

注意,ij选项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功能。

enter image description here