将分隔字符串的系列拆分为可变数量的字段,填充缺少的字段

2024-09-30 00:36:19 发布

您现在位置:Python中文网/ 问答频道 /正文

在下面的数据帧中,我希望将系列“资源”正确地分割到其不同的组件中,这些组件本机由字符“\u1”分隔:

^{tb1}$
import pandas as pd
Data = {'resource':['MTUG1_ABO_DPP_1','MTUG1_ABO_DPP_2','MTUG1_ABO_DPP_3','MTUG1_ABO_DPP_4','MTUG1_ABO_DPP_5','MTUG1_ABO_DPU_1','MTUG1_ABO_DPU_2','MTUG1_ABO_DPU_3','MTUG1_ABO_UUB_VDU1_1','MTUG1_ABO_UUB_VDU1_2','MTUG1_ABO_UUB_VDU1_3','MTUG1_ABO_UUB_VDU2_1','MTUG1_ABO_UUB_VDU2_2']}
df = pd.DataFrame(Data, columns= ['resource'])

我想要的结果是:

^{tb2}$

因此,MTUG1-->;成为新列“节点”的内容 DPPDPUUUB-->;成为新列“Unit”的内容 然后,我需要构建另一个新的系列“vm”,其中我将“Unit”中的字符串与下一个数字(通过添加“u”)连接起来,如果“Unit_num”中的内容是VDUx,我还需要将其与第五部分(vdu_num)连接起来

但如果我使用:

df['Node']=df['resource'].str.split("_").str.get(0)
df['Unit']=df['resource'].str.split("_").str.get(2)
unit_num=df['resource'].str.split("_").str.get(3)
vdu_num=df['resource'].str.split("_").str.get(4)
df['vm']=df['Unit'].str.cat(vm_num, sep="_").str.cat(vdu_num, sep="_")
df['vm'].unique()

我只得到VDU组件:

array([nan, 'UUB_VDU1_1', 'UUB_VDU1_2', 'UUB_VDU1_3', 'UUB_VDU2_1',
   'UUB_VDU2_2'], dtype=object)

要查看其余部分,我必须删除最后一个连接。你将如何解决它


Tags: dfget组件vmunitnumresourcesplit
2条回答

您可以使用布尔索引分别应用这两种情况,检查vdu_num是否为NaN

df.loc[~vdu_num.isna(), 'vm']=df['Unit'].str.cat(unit_num, sep="_").str.cat(vdu_num, sep="_")
df.loc[vdu_num.isna(), 'vm']=df['Unit'].str.cat(unit_num, sep="_")

产生

    resource              Node    Unit    unit_num      vdu_num  vm
                                    -       
 0  MTUG1_ABO_DPP_1       MTUG1   DPP     1                 nan  DPP_1
 1  MTUG1_ABO_DPP_2       MTUG1   DPP     2                 nan  DPP_2
 2  MTUG1_ABO_DPP_3       MTUG1   DPP     3                 nan  DPP_3
 3  MTUG1_ABO_DPP_4       MTUG1   DPP     4                 nan  DPP_4
 4  MTUG1_ABO_DPP_5       MTUG1   DPP     5                 nan  DPP_5
 5  MTUG1_ABO_DPU_1       MTUG1   DPU     1                 nan  DPU_1
 6  MTUG1_ABO_DPU_2       MTUG1   DPU     2                 nan  DPU_2
 7  MTUG1_ABO_DPU_3       MTUG1   DPU     3                 nan  DPU_3
 8  MTUG1_ABO_UUB_VDU1_1  MTUG1   UUB     VDU1                1  UUB_VDU1_1
 9  MTUG1_ABO_UUB_VDU1_2  MTUG1   UUB     VDU1                2  UUB_VDU1_2
10  MTUG1_ABO_UUB_VDU1_3  MTUG1   UUB     VDU1                3  UUB_VDU1_3
11  MTUG1_ABO_UUB_VDU2_1  MTUG1   UUB     VDU2                1  UUB_VDU2_1
12  MTUG1_ABO_UUB_VDU2_2  MTUG1   UUB     VDU2                2  UUB_VDU2_2

您可以简化拆分(只执行一次),然后还可以使用where来执行unit_numvdu_num,具体取决于非空值:

df2 = (
    df['resource']
    .str.split('_', expand=True)[[0, 2, 3, 4]]
    .set_axis('Node Unit unit_num vdu_num'.split(), axis=1)
)
df2['vm'] = df2['Unit'].str.cat(
    df2['unit_num'].where(df2['vdu_num'].isnull(), df2['vdu_num']), sep='_')

或者,如果您希望覆盖原始df

df = pd.concat([
    df['resource'],
    df['resource']
    .str.split('_', expand=True)[[0, 2, 3, 4]]
    .set_axis('Node Unit unit_num vdu_num'.split(), axis=1)
], axis=1)
df['vm'] = df['Unit'].str.cat(
    df['unit_num'].where(df['vdu_num'].isnull(), df['vdu_num']), sep='_')

相关问题 更多 >

    热门问题