选择线上方/下方的点

时间:2019-05-22 08:50:23

标签: python pandas

我有以下数据集:

df = pd.DataFrame(np.random.rand(50,2), columns=list('AB'))

绘图数据

plt.scatter(x=df.A, y=df.B)

x = plt.axhline(y=0.4,c='k')
y = plt.axvline(x=0.4,c='k')
plt.plot([0.2, 0.3], [0, 0.4], c='k')

我要在绿色区域中选择点(请参见下图)。第二象限中的点很容易选择,但第三象限中绿色区域中的点不容易选择。

这是我在第二象限中选择点的方式:

df[( df['A'] < 0.4) & (df['B'] > 0.4)]

在这之后我被卡住了。

考虑条件可能会变得复杂,例如处理曲线等。解决此问题的最佳方法是什么?

打开获取任何建议。

JavascriptExecutor

2 个答案:

答案 0 :(得分:2)

我建议您可以使用functools:

import numpy as np
import functools

cr1 = functools.reduce(np.logical_and, [df.B < 0.4, df.A < 0.2])
cr2 = functools.reduce(np.logical_and, [df.B < 0.4, df.A > 0.2, df.B > (df.A-0.2)*4])
df_filtered = df[functools.reduce(np.logical_or, [cr1,cr2])]

答案 1 :(得分:1)

自从我答应了一个解决方案以来,这里是一个不使用functools的解决方案:

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

np.random.seed(42)
df = pd.DataFrame(np.random.rand(50,2), columns=list('AB'))
plt.scatter(x=df.A, y=df.B)

x = plt.axhline(y=0.4,c='k')
y = plt.axvline(x=0.4,c='k')
plt.plot([0.2, 0.3], [0, 0.4], c='k')

# the next line is the one selecting all datapoints within 
sub_df = df[(( df['A'] < 0.4) & (df['B'] > 0.4)) | (df['B'] < 0.4) & (df['A'] < (0.2 + 0.25*df['B']))]
plt.scatter(sub_df['A'], sub_df['B'], marker='x', color='red')

plt.xlabel('A')
plt.ylabel('B')

plt.show()

子句df['A'] < (0.2 + 0.25*df['B'])仅描述线性函数。您可以用它代替其他任何东西(例如指数函数)。

上面的代码生成的图:

enter image description here