Python 选择线上方/下方的点

Python 选择线上方/下方的点,python,pandas,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 = 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)]
在这之后,我被卡住了

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

欢迎任何建议


我建议您可以使用以下工具:

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])]
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()

由于我承诺了一个解决方案,这里有一个不使用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])]
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']只描述了一个线性函数。你可以用它来代替其他任何东西,比如指数函数

根据上述代码生成的绘图:


[0.2,0.3]、[0,0.4]线函数是否已确定?你想如何解决这个问题,即通过数学函数或应用分类器?我会尝试类似df[df['a']<0.4&df['B']>0.4 | df['B']df.A-0.2*4]”谢谢,functools也能工作,但这更简单易懂: