关于使用Lambdas的熊猫数据帧的条件语句

时间:2017-12-19 16:11:07

标签: python pandas lambda

我陷入了一个简单的问题。我正在尝试在熊猫数据框中建立一个列,它只会提高男性(0)的年龄,但由于某种原因,我无法迭代数据帧(它只重复第一个结果,即22)。

这是我的代码:

new_tab['menage'] = new_tab.Gender.apply(
        lambda x: new_tab.iloc[:,1] if x==0 
        else 0)

    Original Age    Gender  menage
0   22.0    0   22.0
1   38.0    1   0.0
2   26.0    1   0.0
3   35.0    1   0.0
4   35.0    0   22.0

我特意尝试为lambda做这件事,同时认识到还有其他选择。

我确信这是一件非常简单的事情,但对于编码来说是新手,目前还不在我身边。

任何帮助都会很棒。

由于

2 个答案:

答案 0 :(得分:0)

您当前的操作不起作用,因为new_tab.iloc[:,1]完整地应用每次调用lambda(而不是像您一样以迭代方式&# 39; d期待)。但是,除了apply之外,还有更快的选项。

选项1
mask

v = df['Original Age'].mask(df['Gender'].astype(bool)).fillna(0)
v

0    22.0
1     0.0
2     0.0
3     0.0
4    35.0
Name: Original Age, dtype: float64

df['menage'] = v

选项2
np.where

np.where(df['Gender'], 0, df['Original Age'])

0    22.0
1     0.0
2     0.0
3     0.0
4    35.0
Name: Original Age, dtype: float64

选项3
包含apply的循环解决方案涉及在整个apply上调用df,因为您需要在lambda中可访问多个列。

df.apply(lambda r: r['Original Age'] if r['Gender'] == 0 else 0, axis=1)

0    22.0
1     0.0
2     0.0
3     0.0
4    35.0
dtype: float64

答案 1 :(得分:0)

另一种选择是使用assign并让pandas将索引上的数据对齐,使用queryboolean indexing过滤数据框:

df.assign(menage = df.query('Gender == 0')['Original Age']).fillna(0)

df.assign(menange = df.loc[df['Gender'] == 0, 'Original Age']).fillna(0)

输出:

   Original Age  Gender  menage
0          22.0       0    22.0
1          38.0       1     0.0
2          26.0       1     0.0
3          35.0       1     0.0
4          35.0       0    35.0
相关问题