【问题标题】:Conditional statements on Panda Dataframes using Lambdas使用 Lambda 的 Panda Dataframes 条件语句
【发布时间】:2017-12-19 16:11:06
【问题描述】:

我陷入了一个简单的问题。我正在尝试在 Panda 数据框中建立一个列,它只会拉起男性 (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 做这件事,同时认识到还有其他可用的替代方案。

我确信这确实很简单,但目前对编码不熟悉。

任何帮助都会很棒。

谢谢

【问题讨论】:

  • 您能否展示您的预期输出,以便我们知道我们正确理解了您?

标签: python pandas lambda


【解决方案1】:

您当前的操作不起作用,因为new_tab.iloc[:,1] 的整体被应用每次lambda 被调用(而不是像您期望的那样以迭代方式)。但是,除了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 的循环解决方案将涉及在整个 df 上调用 apply,因为您需要在 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

【讨论】:

  • 嗨 Coldspeed - 非常感谢您的帮助(以及格式化我的原始帖子,因为我不知道如何正确展示我的表格) - 这真的很有用,而且真的很有帮助!
  • @Foxtrot82 你能告诉我你的列名是什么吗? [“原始时代”,“性别”]?我很困惑,我现在会修复我的答案。不客气!
【解决方案2】:

另一种选择是使用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

【讨论】:

  • 嗨,斯科特,感谢您的建议。我以前不知道assign,但会更多地研究它,因为它似乎很有用
猜你喜欢
  • 1970-01-01
  • 2019-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-07
  • 2022-11-10
  • 2018-11-06
  • 2018-11-09
相关资源
最近更新 更多