python - 在多个条件下分配对象侧标签
问题描述
我正在考虑一个几何问题,这里称为对象Thing
(主要是矩形)被分成更小的矩形。在我的数据框中,我有两列s1
和s2
:
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
说明:如果取Thing
A,则列s1
的值为 2。这意味着 A 是一个矩形(Thing
由于列中的 2,B也是如此s2
。任何一列中具有 2 的事物s1
或者s2
是矩形。所有其他都是不是。
对于Thing
A,该列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
我很感激在这方面的任何帮助。
解决方案
您可以尝试使用多个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
>>>
推荐阅读
- google-bigquery - Airflow Jinja 模板不适用于自定义运算符
- javascript - 如何将“&”更改为 & 用于 twitter javascript 程序
- c# - WPF C# POS 打印机,从下拉菜单中打开设备
- linux-mint - 无法在 linux mint19.2 中安装 Albert
- javascript - 如何根据道具的更新来更新状态?
- javascript - 用事件设置值
- sql - Oracle SQL 触发器:更新后,将行插入另一个表
- c# - 循环遍历目录中的每个 PDF 文件
- amazon-web-services - 用于备份 Web 和数据库服务器的 AWS 服务。从灾难恢复备份启动新环境
- java - Quarkus 和 Keycloak/OIDC - NullPointerException