python—由系列驱动的多个条件

k2arahey  于 2021-09-29  发布在  Java
关注(0)|答案(1)|浏览(268)

我有一个数据框,它存储了一个人居住的地方,看起来像这样:
科室人员1A101人员11A102人员21B101人员32A103人员42C102人员5
我还有另一个数据框,它指定了使该住房单元特殊的所有sect/pad/room组合(注意:如果不存在start\u room和end\u room,则表示该sect/pad中的所有房间都是特殊的):
分区PadroomStart\u roomend\u room1a1011001041a1021c101105500
是否有一种方法可以使用“特殊”数据框识别所有“特殊”的住房单元,然后在第一个数据框中添加一个新列来标记它们。“特殊”数据框要大得多,如果我必须手动执行一个有条件的.loc语句来识别所有的特殊住房单元,这将花费永远的时间。我希望能够以编程方式匹配它们

igetnqfo

igetnqfo1#

因此,我会将第一个 Dataframe 合并到特殊 Dataframe 上,然后添加一个具有特殊条件的列

df_person = pd.DataFrame({'SECT': [1, 1, 1, 2, 2], 
                         'PAD': ['A', 'A', 'B', 'A', 'C'],
                         'ROOM': [101, 102, 101, 103, 102],
                         'PERSON': ['PERSON1', 'PERSON2', 'PERSON3', 'PERSON4', 'PERSON5']})
df_special = pd.DataFrame({'SECT':[1, 1, 1],
                          'PAD':['A', 'A', 'C'],
                          'ROOM':[101, 102, 101],
                          'START_ROOM': [100, '', 105],
                          'END_ROOM': [104, '', 500]})

df_merged = df_person.merge(df_special, on=['SECT', 'PAD', 'ROOM'], how='left')
rows_to_update1 = df_merged[(df_merged['START_ROOM']=='')&
                           (df_merged['END_ROOM']=='')].index
rows_to_update2 = df_merged[((df_merged['ROOM'].astype('int32')>=pd.to_numeric(df_merged['START_ROOM'], errors='coerce'))&
                           (df_merged['ROOM'].astype('int32')<=pd.to_numeric(df_merged['END_ROOM'], errors='coerce')))].index
df_merged['IS_SPECIAL'] = False
df_merged.loc[rows_to_update1.union(rows_to_update2), 'IS_SPECIAL'] = True

这是一个棘手的问题,因为您的开始和结束空间是字符串和整数的混合体。我建议不要将这两列作为空字符串来表示所有房间都很特别。

相关问题