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

拉里

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

我当前的高级方法如下:

  1. 读取Excel文件并创建一个数据框
  2. 重新格式化该表,以在所有字段的旁边创建我希望用数据类型标记的所有数据的列(即,它是字符串,整数还是浮点数)。
  3. 创建一个“数据类型”列,该列将为每个数据包含这些标签,这些数据由正则表达式字典中保存的相应数据类型填充
import os
from glob import glob
import pandas as pd
from os import path
import re

sample_file = 'C:/Users/951297/Documents/Python Scripts/DD\\Fund_Data.xlsx'

dataf = pd.read_excel(sample_file)
dataf

    FUND ID     FUND NAME              AMOUNT
0   10101       Holdings company A     10000
1   20202       Holdings company B     2000.5
2   30303       Holdings company C     3000

# Create column list of data attributes
stackdf= dataf.stack().reset_index()
stackdf = stackdf.rename(columns={'level_0':'index','level_1':'fh',0:'attribute'})

# Create a duplicate column of attribute to apply regex
stackdf_regex = stackdf.iloc[:,2:].rename(columns = {'attribute':'Data Type'})

# Dictionary of regex to replace values within the 'Data Type' column depending on the attribute
repl_dict = {re.compile(r'^[\d]+$'):'Integer',
             re.compile(r'^[a-zA-Z0-9_ ]*$'): 'String',
             re.compile(r'[\d]+\.'): 'Float'}

#concatenate tables
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       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

也许我的正则表达式不正确,或者在将正则表达式应用于数据框时缺乏理解。很高兴收到关于当前方法或我尚未考虑的其他合适/有效方法的任何建议。

注意:我希望最终能够扩展正则表达式字典以考虑更多数据类型,并且我了解检查每个单元格中较大数据集的模式可能不是有效的方法,但我仍处于早期阶段。

Shubham Sharma

您可以使用,np.select其中每个conditions测试都会Data Type使用Series.str.containschoices对应于条件的列测试给定的正则表达式

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用字典中的正则表达式从交易的列中创建类别的列

来自分类Dev

正则表达式断言字典

来自分类Dev

Python:正则表达式或字典

来自分类Dev

是否可以选择特定的正则表达式捕获组以在Pandas中创建列?

来自分类Dev

正则表达式在熊猫列上创建新列

来自分类Dev

根据正则表达式匹配创建新列

来自分类Dev

如何创建正则表达式

来自分类Dev

创建密码正则表达式

来自分类Dev

创建正则表达式

来自分类Dev

正则表达式的创建

来自分类Dev

创建正则表达式

来自分类Dev

正则表达式与列熊猫

来自分类Dev

列的正则表达式

来自分类Dev

通过VERBOSE模式传递用于字典创建的多个正则表达式模式的问题

来自分类Dev

使用正则表达式从文本创建python字典以区分特定部分

来自分类Dev

正则表达式:从字符串列表创建字典

来自分类Dev

python正则表达式:从字符串创建字典

来自分类Dev

使用正则表达式和字典重命名数据框列

来自分类Dev

用正则表达式构建字典

来自分类Dev

正则表达式可检测Python字典语法

来自分类Dev

使用正则表达式遍历字典以获取价值

来自分类Dev

将字典应用于正则表达式

来自分类Dev

Python中以正则表达式为键的字典

来自分类Dev

如何使用正则表达式过滤字典的值

来自分类Dev

根据正则表达式创建正则语法

来自分类Dev

如何从由正则表达式创建的每一列的列表中创建DataFrame

来自分类Dev

从数据框中提取列并使用正则表达式创建新列

来自分类Dev

正则表达式?

来自分类Dev

$ {}-正则表达式