【问题标题】:Creating new column in Pandas with a condition based on existing row values and returning another row's values在 Pandas 中使用基于现有行值的条件创建新列并返回另一行的值
【发布时间】:2018-03-15 15:28:28
【问题描述】:

希望对以下问题有所帮助。 我目前有一个包含 3 列的熊猫数据框 - test1、test2、test3

我希望实现的是result_column中的结果,其中的逻辑是:

1) 如果test1中的值AND test2>0,则返回test3的值

2) Else 如果 test1 AND test2 NEGATIVE 值

3) 否则返回 0

  test1  test2  test3  result_column
0    0.5    0.1   1.25    1.25
1    0.2   -0.2   0.22       0
2   -0.3   -0.2   1.12   -1.12
3    0.4   -0.3   0.34       0
4    0.5      0   0.45       0

这是我第一次发布关于 python 和 pandas 的问题。如果这里的格式不是最佳的,请提前道歉。感谢我能得到的任何帮助!

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    我认为需要numpy.select 与& (AND) 链接的条件或按子集[[]] 选择所有测试列,比较DataFrame.all 的ant 测试:

    m1 = (df.test1 > 0) & (df.test2 > 0)
    #alternative
    #m1 = (df[['test1', 'test2']] > 0).all(axis=1)
    
    m2 = (df.test1 < 0) & (df.test2 < 0)
    #alternative
    #m2 = (df[['test1', 'test2']] < 0).all(axis=1)
    
    df['result_column'] = np.select([m1,m2], [df.test3, -df.test3], default=0)
    print (df)
       test1  test2  test3  result_column
    0    0.5    0.1   1.25           1.25
    1    0.2   -0.2   0.22           0.00
    2   -0.3   -0.2   1.12          -1.12
    3    0.4   -0.3   0.34           0.00
    4    0.5    0.0   0.45           0.00
    

    【讨论】:

    • 谢谢,这确实很好用!但是,它给出了“SettingwithCopyWarning”错误。虽然我仍然能够运行这个块。我需要担心这个错误吗? C:\blp\BQuant\environments\bqnt-0.42.2\lib\site-packages\bqnb\kernelapp.py:4:SettingWithCopyWarning:试图在数据帧的切片副本上设置值。尝试改用 .loc[row_indexer,col_indexer] = value
    • 我认为问题应该是另一个问题 - 我猜 need copy 如果过滤。或者set values 可能有问题 - 检查here
    • @Singapore123 - 你能告诉我df['result_column'] = np.select([m1,m2], [df.test3, -df.test3], default=0)上面的代码吗?
    • 我使用了你建议的那个 - m1 = (df.test1 > 0) & (df.test2 > 0) m2 = (df.test1
    【解决方案2】:

    巧妙地使用np.sign 和逻辑
    如果两者都是&gt; 0 或两者都是&lt; 0,则产品为1,否则产品为-1 或0。如果两者都是&gt; 0,那么总和的符号是1。如果两者都是&lt; 0,则总和的符号为-1,否则为0。这些东西的产物正是我们想要的。

    v = np.sign(df[['test1', 'test2']].values)
    df.assign(result_column=v.prod(1) * np.sign(v.sum(1)) * df.test3 + 0)
    
       test1  test2  test3  result_column
    0    0.5    0.1   1.25           1.25
    1    0.2   -0.2   0.22           0.00
    2   -0.3   -0.2   1.12          -1.12
    3    0.4   -0.3   0.34           0.00
    4    0.5    0.0   0.45           0.00
    

    【讨论】:

      猜你喜欢
      • 2021-07-17
      • 1970-01-01
      • 2020-11-17
      • 2018-12-30
      • 2021-09-25
      • 1970-01-01
      • 2020-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多