Python 从正则表达式字典创建列

Python 从正则表达式字典创建列,python,regex,pandas,dataframe,Python,Regex,Pandas,Dataframe,我想创建一个列,基本上显示excel电子表格中数据的数据类型,即,如果任何给定单元格中的数据是字符串、整数或浮点等。目前,我正在使用模拟数据进行测试,并希望最终将其用于具有更多字段标题的更大excel文件 我目前的高级方法如下: 读取Excel文件并创建数据框 重新设置此表的格式,以创建一列包含我希望用数据类型(即,如果是字符串、整数或浮点)标记的所有数据,以及相应的字段标题 创建一个“数据类型”列,该列将包含每个数据段的这些标签,这些数据段由正则表达式字典中的相应数据类型填充 这是我希望将正则

我想创建一个列,基本上显示excel电子表格中数据的数据类型,即,如果任何给定单元格中的数据是字符串、整数或浮点等。目前,我正在使用模拟数据进行测试,并希望最终将其用于具有更多字段标题的更大excel文件

我目前的高级方法如下:

  • 读取Excel文件并创建数据框
  • 重新设置此表的格式,以创建一列包含我希望用数据类型(即,如果是字符串、整数或浮点)标记的所有数据,以及相应的字段标题
  • 创建一个“数据类型”列,该列将包含每个数据段的这些标签,这些数据段由正则表达式字典中的相应数据类型填充
  • 这是我希望将正则表达式应用到的重新格式化的表:

       index    fh          attribute                Data Type
    0   0      FUND ID      10101                    10101
    1   0      FUND NAME    Holdings company A       Holdings company A
    2   0      AMOUNT       10000                    10000
    3   1      FUND ID      20202                    20202
    4   1      FUND NAME    Holdings company B       Holdings company B
    5   1      AMOUNT       2000.5                   2000.5
    6   2      FUND ID      30303                    30303
    7   2      FUND NAME    Holdings company C       Holdings company C
    8   2      AMOUNT       3000                     3000
    
    这是所需的输出:

       index    fh          attribute                Data Type
    0   0      FUND ID      10101                    Integer
    1   0      FUND NAME    Holdings company A       String
    2   0      AMOUNT       10000                    Integer
    3   1      FUND ID      20202                    Integer
    4   1      FUND NAME    Holdings company B       String
    5   1      AMOUNT       2000.5                   Float
    6   2      FUND ID      30303                    Integer
    7   2      FUND NAME    Holdings company C       String
    8   2      AMOUNT       3000                     Integer
    
    但是,以下代码生成下表:

    stackdf_regex = stackdf_regex.replace({'Data Type':repl_dict}, regex=True)
    pd.concat([stackdf, stackdf_regex], axis=1)
    
      index     fh          attribute             Data Type
    0   0       FUND ID     10101                 10101
    1   0       FUND NAME   Holdings company A    String
    2   0       AMOUNT      10000                 10000
    3   1       FUND ID     20202                 20202
    4   1       FUND NAME   Holdings company B    String
    5   1       AMOUNT      2000.5                2000.5
    6   2       FUND ID     30303                 30303
    7   2       FUND NAME   Holdings company C    String
    8   2       AMOUNT      3000                  3000
    
    也许我的正则表达式不正确,或者我对在数据帧上应用正则表达式缺乏理解。很高兴收到关于当前方法或其他我未考虑过的合适/有效方法的任何建议

    注意:我希望最终扩展regex字典以考虑更多的数据类型,我知道检查每个单元格中是否有较大数据集的模式可能不是很有效,但我仍处于早期阶段。

    您可以使用,其中,每个
    条件
    使用
    选项对列
    数据类型
    测试给定正则表达式
    ,并且
    选项
    对应于以下条件:

    conditions = [
        df['Data Type'].str.contains(r'^\d+$'), 
        df['Data Type'].str.contains(r'^[\w\s]+$'), 
        df['Data Type'].str.contains(r'^\d+\.\d+$')]
    
    choices = ['Interger', 'String', 'Float']
    
    df['Data Type'] = np.select(conditions, choices, default=None)
    

    您可以使用,其中每个
    条件
    测试列
    数据类型的给定正则表达式,并且
    选项
    对应于以下条件:

    conditions = [
        df['Data Type'].str.contains(r'^\d+$'), 
        df['Data Type'].str.contains(r'^[\w\s]+$'), 
        df['Data Type'].str.contains(r'^\d+\.\d+$')]
    
    choices = ['Interger', 'String', 'Float']
    
    df['Data Type'] = np.select(conditions, choices, default=None)
    

    conditions = [
        df['Data Type'].str.contains(r'^\d+$'), 
        df['Data Type'].str.contains(r'^[\w\s]+$'), 
        df['Data Type'].str.contains(r'^\d+\.\d+$')]
    
    choices = ['Interger', 'String', 'Float']
    
    df['Data Type'] = np.select(conditions, choices, default=None)
    
    # print(df)
       index         fh           attribute Data Type
    0      0    FUND ID               10101  Interger
    1      0  FUND NAME  Holdings company A    String
    2      0     AMOUNT               10000  Interger
    3      1    FUND ID               20202  Interger
    4      1  FUND NAME  Holdings company B    String
    5      1     AMOUNT              2000.5     Float
    6      2    FUND ID               30303  Interger
    7      2  FUND NAME  Holdings company C    String
    8      2     AMOUNT                3000  Interger