我陷入了一个简单的问题。我正在尝试在熊猫数据框中建立一个列,它只会提高男性(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做这件事,同时认识到还有其他选择。
我确信这是一件非常简单的事情,但对于编码来说是新手,目前还不在我身边。
任何帮助都会很棒。
由于
答案 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将索引上的数据对齐,使用query
或boolean 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