如何重新分类从任意整数创建的 2 行周围的数据

我有一个包含 2 条线的图(由特定方程创建),我正在尝试根据我的数据相对于线的位置创建新的 Pandas 数据框。

In [1]: import pandas as pd 
        import numpy as np 
        import matplotlib.pyplot as plt 
In [2]: df = pd.DataFrame([ [-1.0,0],[-1.0,1.5],[-0.15,[0.5,0.5] ],columns=['x','y']) 
        df                                                                      
Out[2]: 
      x    y
0 -1.00  0.0
1 -1.00  1.5
2 -0.15  0.0
3  0.5  0.5

我有两条线将与 df 中的数据一起绘制,这些线定义为:

In [3]: def line1(): 
            x1 = np.linspace(-2,500) 
            y1 = 0.61/(x1 - 0.05) +1.3 
            return x1,y1 
         
        def line2(): 
            x2 = np.linspace(-2,0.3,500) 
            y2 = 0.61/(x2 - 0.47) + 1.19 
            return x2,y2 

情节如下:

如何重新分类从任意整数创建的 2 行周围的数据

因此,从 df 开始,我想根据点所在的 4 个位置(例如 df_red、df_green、df_black、df_blue)创建 4 个新数据帧。 我目前的想法是尝试这样的事情:

In [4]: line_orange = line1() 
        line_magenta = line2() 
         
        df_red = df[ (df.x < line_orange) & (df.y < line_magenta) ] 
        df_green = df[ (df.x < -0.9) & (df.y > line_magenta) ] 
        df_black = df[ (df.x < line_magenta) & (df.x > line_orange) ] 
        df_blue = df[ (df.x > line_magenta) ] 

现在我不能 100% 确定这些参数将在哪里正确分类我的点,但我无法检查,因为这种分类不起作用 - 它引发:

ValueError: operands could not be broadcast together with shapes (4,) (2,500) 

我愿意接受对我的观点进行分类的方法的建议。我不想遍历我的实际数据帧,因为它非常大。不要担心我的实际分类,只要我找到一种拆分数据的方法,我就可以使用它,谢谢!

my183300 回答:如何重新分类从任意整数创建的 2 行周围的数据

在一点相交的两条线可以将页面分成四个部分。在该方法中,可以利用直线方程来获得任意点的类别。

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
df = pd.DataFrame([ [-1.0,0],[-1.0,1.5],[-0.15,[0.5,0.5] ],columns=['x','y'])  
line1 = lambda x,y:y>=(0.61/(x - 0.05) +1.3)
line2 = lambda x,y:y>=(0.61/(x - 0.47) + 1.19)
classifier = lambda al1,al2: (4 if al2 else 3) if al1 else (2 if al2 else 1)
df['above_line_1'] = df.apply(lambda row:line1(row.x,row.y),axis=1)
df['above_line_2'] = df.apply(lambda row:line2(row.x,axis=1)
df['class'] = df.apply(lambda row:classifier(row.above_line_1,row.above_line_2),axis=1)

输出:

    x   y   above_line_1    above_line_2    class
0   -1.00   0.0     False   False   1
1   -1.00   1.5     True    True    4
2   -0.15   0.0     True    False   3
3   0.50    0.5     False   False   1
,

这是一个简单的方法。定义两个函数来计算两条线的点:

def f1(x):
    return 0.61/(x - 0.05) +1.3 

def f2(x):
    return 0.61/(x - 0.47) + 1.19 

然后比较y相对于f1(x)f2(x)的位置并用它来分组:

groups = {group: d for group,d in df.groupby([df['y'].gt(f1(df['x'])),df['y'].gt(f2(df['x']))])}

输出:

{(False,False):      x    y
 0 -1.0  0.0
 3  0.5  0.5,(True,False):       x    y
 2 -0.15  0.0,True):      x    y
 1 -1.0  1.5}

如果你想要一些东西作为数据框:

df['above_f1'] = df['y'].gt(f1(df['x']))
df['above_f2'] = df['y'].gt(f2(df['x']))
df.set_index(['above_f1','above_f2']).sort_index()

输出:

                      x    y
above_f1 above_f2           
False    False    -1.00  0.0
         False     0.50  0.5
True     False    -0.15  0.0
         True     -1.00  1.5
本文链接:https://www.f2er.com/1165.html

大家都在问