首页 > 解决方案 > 在多个条件下分配对象侧标签

问题描述

我正在考虑一个几何问题,这里称为对象Thing(主要是矩形)被分成更小的矩形。在我的数据框中,我有两列s1s2

Thing  s1  s2  id1  id2
0      A   2   4    0    1
1      A   2   4    1    2
2      A   2   4    1    3
3      A   2   4    0    4
4      B   6   2    1    1
5      B   6   2    2    0
6      B   6   2    3    0
7      B   6   2    4    1
8      B   6   2    5    1
9      B   6   2    6    0
10     C   6   2    1    4
11     C   3  10    2    0
12     C   3  10    3    6
13     C   3  10    4   67
14     C   3  10    5    0
15     C   3  10    5    3
16     C   3  10    6    4
17     C   3  10    6    4
18     C   3  10    6    3
19     C   3  10    6    3

说明:如果取ThingA,则列s1的值为 2。这意味着 A 是一个矩形(Thing由于列中的 2,B也是如此s2。任何一列中具有 2 的事物s1或者s2是矩形。所有其他都是不是。

对于ThingA,该列id1是 0 或 1,表示我在矩形的哪一侧。对于 A,另一个 ,id2只是拆分的计数。

现在,我想要的是一种创建列的方法,该列Side标记数据框中每个矩形的边。我想要的输出如下:

Thing  s1  s2  id1  id2 Side
0      A   2   4    0    1   S1
1      A   2   4    1    2   S2
2      A   2   4    1    3   S2
3      A   2   4    0    4   S1
4      B   6   2    1    1   S2
5      B   6   2    2    0   S1
6      B   6   2    3    0   S1
7      B   6   2    4    1   S2
8      B   6   2    5    1   S2
9      B   6   2    6    0   S1
10     C   6   2    1    4  NaN
11     C   3  10    2    0  NaN
12     C   3  10    3    6  NaN
13     C   3  10    4   67  NaN
14     C   3  10    5    0  NaN
15     C   3  10    5    3  NaN
16     C   3  10    6    4  NaN
17     C   3  10    6    4  NaN
18     C   3  10    6    3  NaN
19     C   3  10    6    3  NaN

我尝试了以下方法,但它不起作用:

rf = []
for thing in Objects:
    df = Named[Named['Thing']=='{}'.format(thing)]
    if(df.s1==2):
        df = df.assign(Side =np.where(df.id1 == 0, 'S1','S2'))
    if(df.s2==2):
        df = df.assign(Side = np.where(df.id2 == 0, 'S1', 'S2'))
    else:
        df = df.assign(Side = np.where((df.id1>1)|(df.id2>1), np.nan,np.nan)
     rt.append(df)   

Named = Named.assign(Side = np.where((Named.s1 ==2) & (Named.id1 == 0),'S1', np.where((Named.s1 ==2) & (Named.id1 == 1),'S2',
                                             np.where((Named.s2 ==2) & (Named.id2 == 0),'S1', np.where((Named.s2 ==2) & (Named.id2 == 1),'S2',
                                             np.where((Named.s1 !=2) | (Named.s2 != 2),np.nan),np.nan),np.nan),np.nan),np.nan)

现在,用 0S1和 1替换S2根本不起作用,因为 0 很可能会出现在非矩形对象的id1和列中。id2

我很感激在这方面的任何帮助。

标签: pythonpython-3.xpandasdataframe

解决方案


您可以尝试使用多个np.where,也可以groupby

>>> Named['Side'] = np.where(Named.filter(regex=r's\d').eq(2).any(1).groupby(Named['Thing']).transform(all), np.where(np.where(Named['s2'].eq(2), Named['id2'], Named['id1']), 'S2', 'S1'), np.nan)
>>> Named
   Thing  s1  s2  id1  id2 Side
0      A   2   4    0    1   S1
1      A   2   4    1    2   S2
2      A   2   4    1    3   S2
3      A   2   4    0    4   S1
4      B   6   2    1    1   S2
5      B   6   2    2    0   S1
6      B   6   2    3    0   S1
7      B   6   2    4    1   S2
8      B   6   2    5    1   S2
9      B   6   2    6    0   S1
10     C   6   2    1    4  nan
11     C   3  10    2    0  nan
12     C   3  10    3    6  nan
13     C   3  10    4   67  nan
14     C   3  10    5    0  nan
15     C   3  10    5    3  nan
16     C   3  10    6    4  nan
17     C   3  10    6    4  nan
18     C   3  10    6    3  nan
19     C   3  10    6    3  nan
>>> 

推荐阅读