【问题标题】:Pandas on Python If-then commandPython If-then 命令上的 Pandas
【发布时间】:2018-10-24 12:40:57
【问题描述】:

我有如下代码

GU_ES3['Qnd'] = GU_ES3['Qnd,hw_m2'] * GU_ES3['UPOR']

我发现GU_ES3['UPOR'] 中的某些值是空白的。在这种情况下,我想调用其他列,例如GU_ES3['NPOR'],但仅在这种情况下GU_ES3['UPOR'] 列中的值为0NaN

你能帮帮我吗?

【问题讨论】:

  • 这是熊猫吗?还是只是一本字典?
  • 熊猫。我将编辑原始问题。

标签: python pandas if-statement conditional


【解决方案1】:

你想要

  1. 在某种情况下,一个 DataFrame 中的值会被另一个替换
  2. 确保平等对待 0 或 NaN

对于 (2),您可以将 0 替换为 NaN,对于 (1),您可以使用 pd.Series.fillna 将 UPOR 中的 NaN 填充为 NPOR,但仅限于 NaN。

i = GU_ES3['Qnd,hw_m2']
j = GU_ES3['UPOR'].replace(0, np.nan).fillna(GU_ES3['NPOR'])
GU_ES3['Qnd'] = i * j 

或者,您可以使用np.where 来执行替换:

GU_ES3['Qnd'] = GU_ES3['Qnd,hw_m2'] * np.where(
    GU_ES3['UPOR'].replace({0 : np.nan}).isna(), GU_ES3['NPOR'], GU_ES3['UPOR']
)

请注意,对于替换,例如,如果您还想替换 1、2 或 3,则只需在代码中使用 .replace(dict.fromkeys([1, 2, 3], np.nan))

【讨论】:

  • 这是一个看起来很干净的解决方案,但是使用 where 语句(df.where 或 np.where)并检查 0 或 np.nan 不是更容易吗?只需将 where 语句中的值设置为另一列的值?
  • @GrantWilliams 他们只是做同一件事的两种方式。如果不更换,则需要两个条件。如果你想以同样的方式对待两件以上的事情,你将需要更多。最好先更换后忘记。
  • 我绝对认为您的解决方案是最有趣的并且看起来最优雅,但我很好奇它们之间对于大型数据集是否有任何大的性能差异。我假设 pandas 能够使用带有 where 类型语句的逻辑索引
  • @GrantWilliams 当然,可能会有。 replace 和 fillna 都不是以出色的性能而闻名。 OP 最好的做法是根据他们的数据测试这些解决方案,并找出最有效的解决方案。顺便说一句,我自己添加了一个np.where 替代方案。
  • 我绝对喜欢您的解决方案,并且不希望它看起来像我说它不那么好或任何东西。我只是利用任何机会在这些类型的问题上学习一些技术上的权衡。认为这是一个很好的学习机会
【解决方案2】:

尝试使用pd.Series.where

GU_ES3['Qnd'] = GU_ES3['Qnd,hw_m2'] * GU_ES3['UPOR'].where(~GU_ES3['UPOR'].isnull() & (GU_ES3['UPOR'] != 0), other=GU_ES3['NPOR'])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 2021-10-03
    • 2013-07-05
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多