我有以下数据集:
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)]
在这之后我被卡住了。
考虑条件可能会变得复杂,例如处理曲线等。解决此问题的最佳方法是什么?
打开获取任何建议。
答案 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'])
仅描述线性函数。您可以用它代替其他任何东西(例如指数函数)。
上面的代码生成的图: