【问题标题】:Conditional actions in a pandas DataFramepandas DataFrame 中的条件操作
【发布时间】:2019-12-11 13:03:04
【问题描述】:

我有一个熊猫数据框,我想根据另一列中的值设置一列中的值。有 6 种可能的情况,因此单个 if/else 不起作用。我无法将 If/else 组合用于 SBT >=x 和

If SBT > 3.6 Then
ActiveCell.Offset(0, -1) = "2"
ElseIf SBT >= 2.95 And SBT <= 3.6 Then
ActiveCell.Offset(0, -1) = "3"
ElseIf SBT >= 2.6 And SBT <= 2.95 Then
ActiveCell.Offset(0, -1) = "4"
ElseIf SBT >= 2.05 And SBT <= 2.6 Then
ActiveCell.Offset(0, -1) = "5"
ElseIf SBT >= 1.31 And SBT <= 2.05 Then
ActiveCell.Offset(0, -1) = "6"
ElseIf SBT < 1.31 Then
ActiveCell.Offset(0, -1) = "7"
Else
End If

看过

np.where(a < 4, -1, 100)

df['desired_output'] = df['data'].apply(lambda x: 'true' if x <= 2.5 else 'false')

这些都是可行的选择吗?如何嵌套语句(尤其是“这些值之间”部分,或者是否有另一种更有效的方法? 以下数据 (SBT) 和预期结果 (SBTno) 的 sn-p。

SBT   SBTn
7.00    2
1.28    7
3.64    2
2.97    3
2.83    4

【问题讨论】:

  • .apply() with lambda 有它的限制,你有没有想过做一个函数然后用 .apply() ?
  • 我对这个很陌生,这个功能会是什么样子?

标签: python pandas dataframe logic


【解决方案1】:

这是cut的一种方式

s=pd.cut(df.SBT,bins=[0,1.31,2.05,2.6,2.95,3.6,np.Inf],labels=[7,6,5,4,3,2])
0    2
1    7
2    2
3    3
4    4
df['SBTn']=s.astype(str)

【讨论】:

  • 不错的答案和名称更改(:
  • @Datanovice 啊是的 :-)
  • 这很好,我想,但已经引起了进一步的问题。在一行中,数学创建了一个 NaN 输出。我假设由于 (str) 指定,它以 nan 出现,并且无法通过 fillna 或 np.nan 类型替换找到。
  • SBTNn 与深度的关系图看起来也有问题,因为它是按顺序排列 SBTNn 值而不是按数字顺序排列它们。我尝试将 =s.astype 设置为 (int) 但由于 np.Inf 而收到错误消息
  • 好的,忽略我的最后一个,我可以使用 pd.to_numeric 转换它们
【解决方案2】:

另一种选择是在函数中编写逻辑并使用apply

def create_desired_output(SBT):
    if SBT > 3.6:
        return 2
    if SBT >= 2.95 and SBT <= 3.6:
        return 3
    if SBT >= 2.6 and SBT <= 2.95:
        return 4
    if SBT >= 2.05 and SBT <= 2.6:
        return 5
    if SBT >= 1.31 and SBT <= 2.05:
        return 6
    if SBT < 1.31:
        return 7
    return ''
df['desired_output'] = df['SBT'].apply(lambda x: create_desired_output(x))
df

【讨论】:

    【解决方案3】:

    通过使用 python for 循环尝试使用这种不违背 pandas 核心功能的设置:

    使用 numpy :

    import numpy as np
    col         = 'SBT'
    conditions  = [ df[col] > 3.4, (df[col] > 2.95) & (df[col] <= 3.6)] 
    choices     = [ 2, 3]
    df2["desired_output"] = np.select(conditions, choices, default=np.nan) 
    # adding NaN for anything that doesn't meet the condition
    

    conditions 有你的逻辑输入,想象一下你的 if,else 语句没有输出。

    当这些条件以与您的条件相同的顺序满足时,选择是输出。

    然后您可以使用np.select 来初始化数据帧上的逻辑。

    如果您的实际逻辑与您的示例输入相匹配,则最好使用@YO 和 BEN_W 答案,如果您有 if/else 类型逻辑,请尝试上述方法。

    如果你想嵌套np.where

    你可以做这样的事情会很长,所以我只推荐较短的条件。

    np.where(x > 1, -1,
                      (np.where(x < 1, 0,
                                         (np.where(x... 
    

    【讨论】:

      猜你喜欢
      • 2020-04-26
      • 2015-09-25
      • 2022-12-22
      • 2015-09-18
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      • 2019-11-04
      • 2017-11-30
      相关资源
      最近更新 更多