代码之家  ›  专栏  ›  技术社区  ›  sgerbhctim

如何将值连接到字符串集?

  •  2
  • sgerbhctim  · 技术社区  · 5 年前

    假设我有一个如下所示的数据帧:

    REFERENCE_CODE   DUMMY_DATA
    dog              foo
    cat              fi
    fish             fo
    bird             fum
    1                u
    2                v
    3                x
    4                y
    

    我的目标是创建一个数据帧,它将变成:

    REFERENCE_CODE  DUMMY_DATA
    dog             foo
    cat             fi
    fish            fo
    bird            fum
    dog_1           u
    dog_2           v
    dog_3           x
    dog_4           y
    cat_1           u
    cat_2           v
    cat_3           x 
    cat_4           y
    fish_1          u
    fish_2          v
    fish_3          x
    fish_4          y
    bird_1          u
    bird_2          v
    bird_3          x
    bird_4          y
    

    我能够:

    REFERENCE_CODE  DUMMY_DATA
    dog             foo
    cat             fi
    fish            fo
    bird            fum
    bird_1          u
    bird_2          v
    bird_3          x
    bird_4          y
    

    使用以下代码:

    df.REFERENCE_CODE = df.REFERENCE_CODE.fillna('')
    df['REFERENCE_CODE'] = df['REFERENCE_CODE'].apply(lambda x: str(x))
    headers = (df.REFERENCE_CODE != '') & ~df['REFERENCE_CODE'].fillna('').str.isnumeric()
    res = df.groupby(headers.cumsum())['REFERENCE_CODE'].apply(lambda x: x.iloc[0] + '_' + x)
    df.REFERENCE_CODE.update(res[df.REFERENCE_CODE.str.isnumeric()])
    

    我如何得到它适用于所有其他的,并扩展数据文件,同时不丢失其他列的完整性。

    2 回复  |  直到 5 年前
        1
  •  0
  •   jezrael    5 年前

    想法是使用交叉连接和过滤的非数字 REFERENCE_CODE 带数值筛选行的列:

    #simplify code
    df['REFERENCE_CODE'] = df.REFERENCE_CODE.fillna('').astype(str)
    mask = (df.REFERENCE_CODE != '') & ~df['REFERENCE_CODE'].str.isnumeric()
    
    #filter by condition for matched and not matched rows
    df1 = df[mask]
    df2 = df[~mask]
    
    #cross join
    df = df1[['REFERENCE_CODE']].assign(A=1).merge(df2.assign(A=1), on='A')
    #join columns together
    df['REFERENCE_CODE'] = df['REFERENCE_CODE_x'] + '_' + df['REFERENCE_CODE_y']
    
    #concat new DataFrame with first filtered
    df = pd.concat([df1, df[['REFERENCE_CODE','DUMMY_DATA']]], ignore_index=True)
    

    print (df)
       REFERENCE_CODE DUMMY_DATA
    0             dog        foo
    1             cat         fi
    2            fish         fo
    3            bird        fum
    4           dog_1          u
    5           dog_2          v
    6           dog_3          x
    7           dog_4          y
    8           cat_1          u
    9           cat_2          v
    10          cat_3          x
    11          cat_4          y
    12         fish_1          u
    13         fish_2          v
    14         fish_3          x
    15         fish_4          y
    16         bird_1          u
    17         bird_2          v
    18         bird_3          x
    19         bird_4          y
    
        2
  •  0
  •   yatu Sayali Sonawane    5 年前

    您可以首先使用必要的值对数据帧进行切片,以生成输出的扩展部分:

    m = 4
    codes = df.REFERENCE_CODE.iloc[:m]
    dum = df.DUMMY_DATA.iloc[m:].values
    

    在列表理解顺序中使用字符串格式生成包含 REFERENCE_CODE :

    x = [[f'{i+1}_{j}', dum[i]] for j in codes for i in range(m)]
    new = pd.DataFrame(x, columns=df.columns)
    

    然后使用 .append 新的数据帧 df :

    df.iloc[:m].append(new)
    
        REFERENCE_CODE DUMMY_DATA
    0             dog        foo
    1             cat         fi
    2            fish         fo
    3            bird        fum
    4           1_dog          u
    5           2_dog          v
    6           3_dog          x
    7           4_dog          y
    8           1_cat          u
    9           2_cat          v
    10          3_cat          x
    11          4_cat          y
    12         1_fish          u
    13         2_fish          v
    14         3_fish          x
    15         4_fish          y
    16         1_bird          u
    17         2_bird          v
    18         3_bird          x
    19         4_bird          y