如果任何行包含负值,如何引发错误消息

时间:2017-02-26 09:39:48

标签: python python-3.x pandas numpy

我有一个如下所示的数据框

数据帧DF

enter image description here

首先,我必须过滤掉包含以V
开头的名称的列 然后,如果任何行包含负值,则必须检查过滤后的数据帧,并且对于包含负值的行,我必须提高和出错 其次,如果非滤波数据帧(W)包含任何负值,则必须发出警告消息 我使用下面的代码来分隔以V

开头的列
df1=df.filter(regex='V')

df2=df1[df<0]

请帮助您进一步了解。

1 个答案:

答案 0 :(得分:0)

以下是此示例中要处理的一些虚拟数据:

import pandas as pd
import numpy as np

# create dummy data
numbers = np.random.randint(-100, 100, size=(5, 4))

# save as temporary file for timeit
df = pd.DataFrame(numbers, columns=["V1", "V2", "W1", "W2"])

print(df)

   V1  V2  W1  W2
0  53  88  36 -33
1  -1 -85  60  -8
2  27  34 -11  61
3  92  54 -76 -37
4 -16 -39  13 -81

基本上,这里需要两个步骤。首先,过滤已为其提供解决方案的相关列。这里只是一个简短的注释,您可以使用like参数,这个参数在本例中更合适,因为您不需要正则表达式的全部功能。

其次,您需要一个函数来过滤包含零以下任何值的所有行。这正是filter_negatives函数在下面的功能。特别是,lt(0)返回True,所有值低于0 any(axis=1)为所有行索引返回True,其中行中的任何值(axis = 1)为True。

def filter_negatives(sub_df):
    bool_series = sub_df.lt(0).any(axis=1)  
    return sub_df.index[bool_series]

neg_v_rows = filter_negatives(df.filter(like="V"))
neg_w_rows = filter_negatives(df.filter(like="W"))

print(neg_v_rows)
Int64Index([1, 4], dtype='int64')

print(neg_w_rows)
Int64Index([0, 1, 2, 3, 4], dtype='int64')

最后,您可以根据neg_v_rowsneg_w_rows提出错误或创建警告。因为我不确定你想如何在这里引发错误或返回警告,所以我暂时跳过这个。在Python中引发错误最终会破坏程序(如果没有捕获),并且上面的虚拟表包含几乎所有行中低于零的值。如果需要,请说明。

要检查您的未过滤数据框是否包含任何负值,您只需使用neg_w_rows.any()即可。