【问题标题】:Applying series of conditions to dataframe. Pandas将一系列条件应用于数据框。熊猫
【发布时间】:2020-05-26 10:48:54
【问题描述】:

我曾经在向数据框应用多个条件时使用 np.where 函数,并且感觉很好。 我想改进我的代码,其中在 np.where 中的每组条件中重复相同的条件,我不知道如何以最简单的方式(清晰简洁的方式)做到这一点,或者使用 (1) 。 loc 或 (2) IF "条件" DO "应用其他条件"

例子:

我只需要选择“日期”处于条件下的行(例如 >20200201),并且仅针对这些行,计算新列,应用另一组不同的条件(例如条件 1:A >20 和 B > 20;条件 2:A==30 和 B==10,条件 3:A==20 和 B>=10 等)

我的问题是最好的方法来做出第一个选择(数据 >20200202)而不是在每一行中重复 Date>2020201 并避免这种情况:

import pandas as pd
import numpy as np

df = pd.DataFrame({"ID": [1,3,2,2,3,1,3,2],
           "Date": [20200109, 20200204, 20200307, 20200216, 20200107, 20200108, 20200214, 20200314],
           "A": [20,10,40,40,10,20, 40,30], 
           "B": [20,30,40,50,20, 30, 20, 10]})

df['new']=np.nan
df['new']=np.where((df['Date']>20200201) & (df['A']>20) & (df['B']>20), 'value', df['new'])
df['new']=np.where((df['Date']>20200201) & (df['A']==30) & (df['B']==10), 'value', df['new'])
df['new']=np.where((df['Date']>20200201) & (df['A']==20) & (df['B']>=10), 'value', df['new'])

【问题讨论】:

  • 请添加预期输出...您的条件的具体值

标签: python pandas


【解决方案1】:

看来你可以使用np.select

s1 = df.Date <= 20200201
s2 = (df['A'] > 20) & df['B'].gt(20)
s3 = df['A'].eq(30) & df['B'].eq(10)
s4 = df['A'].eq(20) & df['B'].ge(10)

df['new'] = np.select( (s1,s2|s3|s4), (np.nan, 'value'), np.nan)

输出:

   ID      Date   A   B    new
0   1  20200109  20  20    nan
1   3  20200204  10  30    nan
2   2  20200307  40  40  value
3   2  20200216  40  50  value
4   3  20200107  10  20    nan
5   1  20200108  20  30    nan
6   3  20200214  40  20    nan
7   2  20200314  30  10  value

【讨论】:

  • 非常好的解决方案,@Quang Hoang。您建议先定义条件,然后选择适用于每种情况的条件。我仍然不确定我是否可以这样做,因为我不知道会有多少条件以及它们如何相互作用,但我喜欢这个解决方案。谢谢!
  • @Vero 关键是s1 与所有其他条件分开。您可以将其作为第一个条件进行检查,然后所有其他条件都包含在其否定中。
【解决方案2】:

这可能不是最快的解决方案,但它的优势是 可读性易于维护(未来)。

  1. 使用 query 和这些行的索引查找有问题的行:

    ind = df.query('Date > 20200201 and (A > 20 and B > 20 or '
        'A == 30 and B == 10 or A == 20 and B >= 10)').index
    
  2. 在新列中保存新值,在指示的行中:

    df.loc[ind, 'new'] = 'value'; df
    

此列中的其他值保持NaN

如果将来上述条件发生变化,那很容易 并且直观地纠正它。

所以除非你的数据量很大并且执行时间是 这个解决方案太长了,值得考虑。

【讨论】:

  • 我的直觉告诉我,不带括号链接 andor 是一个非常糟糕的主意。
  • 至少在 query 中没有任何问题。但是添加括号也不会有害。特别是如果读者不确定运算符的优先级。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 2018-11-02
  • 2023-01-26
  • 2020-06-03
  • 1970-01-01
  • 1970-01-01
  • 2020-04-23
相关资源
最近更新 更多