选择线上方/下方的点

Red*_*a S 5 python pandas

我有以下数据集:

df = pd.DataFrame(np.random.rand(50,2), columns=list('AB'))
Run Code Online (Sandbox Code Playgroud)

绘图数据

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')
Run Code Online (Sandbox Code Playgroud)

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

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

df[( df['A'] < 0.4) & (df['B'] > 0.4)]
Run Code Online (Sandbox Code Playgroud)

之后,我被卡住了。

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

打开任何建议。

在此处输入图片说明

sek*_*kky 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()
Run Code Online (Sandbox Code Playgroud)

该子句df['A'] < (0.2 + 0.25*df['B'])仅描述一个线性函数。您可以将其替换为其他任何值(例如指数函数)。

上面代码的结果图:

在此输入图像描述