熊猫:检查列子集中的任何值是否符合条件

时间:2018-10-18 09:13:17

标签: python pandas

我有一个数据框,其中包含一个datetime列,一个条件,发生这种情况的连续次数的计数器以及一个value列。看起来像:

date                      condition        count        Value 
01,01,2018 08:00             A               1            9
01,01,2018 08:01             A               2            9
01,01,2018 08:02             A               3            9
01,01,2018 08:03             B               1            9
01,01,2018 08:04             B               2            9
01,01,2018 08:05             B               3            4
01,01,2018 08:06             B               4            9
01,01,2018 08:07             C               1            9
01,01,2018 08:08             C               2            9
01,01,2018 08:09             C               3            9
01,01,2018 08:10             C               4            9

我需要一个错误列,该列会在1和3之间的所有行中返回1,并且在以下情况下条件= B:

-条件= B

-计数<= 3

-至少一个值<5

期望的结果是:

enter code here
         date                condition         count        Value    error
    01,01,2018 08:00             A               1            9         0
    01,01,2018 08:01             A               2            9         0
    01,01,2018 08:02             A               3            9         0
    01,01,2018 08:03             B               1            9         1
    01,01,2018 08:04             B               2            9         1
    01,01,2018 08:05             B               3            4         1
    01,01,2018 08:06             B               4            9         0
    01,01,2018 08:07             C               1            9         0
    01,01,2018 08:08             C               2            9         0
    01,01,2018 08:09             C               3            9         0
    01,01,2018 08:10             C               4            9         0

我尝试过:

df['error']=np.where((df['condition']=='B') & (df['count']<=5) & ((df['Value']).all()>=5), 1, 0)


df['error']=np.where((df['condition']=='B') & (df['count']<=5) & (df.value.apply(lambda x: x<5).any()),0,1)

但是它们似乎都不起作用。你能帮助我吗?谢谢:)

2 个答案:

答案 0 :(得分:1)

尝试一下:

df.loc[(df['condition']=='B')&(df['count']<=3),'error']=1

演示(执行完整代码):

df = your data
df['error']=0
df.loc[(df['condition']=='B')&(df['count']<=3),'error']=1
print(df)

输出:

             date condition  count  Value  error
01,01,2018  08:00         A      1      9      0
01,01,2018  08:01         A      2      9      0
01,01,2018  08:02         A      3      9      0
01,01,2018  08:03         B      1      9      1
01,01,2018  08:04         B      2      9      1
01,01,2018  08:05         B      3      4      1
01,01,2018  08:06         B      4      9      0
01,01,2018  08:07         C      1      9      0
01,01,2018  08:08         C      2      9      0
01,01,2018  08:09         C      3      9      0
01,01,2018  08:10         C      4      9      0

现在可以预期了。

答案 1 :(得分:0)

我不确定我是否正确理解了您的用法,但这可能对您有用

mask = ((df['condition'] == 'B') & (df['count'] <= 5))

if df.loc[mask, 'Value'].min() < 5:
    df.loc[mask, 'Error'] = 1

棘手的事情是,您要根据行组在一行中设置值。我对此并不满意,因为在很多用例中,它无法扩展。

我认为一般情况是将您正在考虑的条件列进行分组,取“ Value”的最小值,然后将其联接回数据框,这将为您提供可用于行的最小值列-明智的比较...我不确定是否可以在没有更一般的示例中看到您实际执行的操作的情况下为您提供示例。