【问题标题】:Writing DataFrame rows to different database Tables using re.match and SQLite使用 re.match 和 SQLite 将 DataFrame 行写入不同的数据库表
【发布时间】:2015-11-07 06:30:00
【问题描述】:

已解决 - 请参阅底部的最终编辑。

我有一个如下所示的 DataFrame:

df_transpose=
Time                     Date  Morning (5AM-9AM)  Day (9AM-6PM)  \
Area                                                            
D1_NY_1         01_05_2012           0.000000       0.000000   
D2_NY_2         01_05_2012           0.000000       0.000000   
D3_NJ_1         01_05_2012           1.000000       0.966667
   ... 

我想使用 SQLite 将这个逐行写入数据库中的不同表。我已经设置了数据库Data.db,其中包含每个区域的单独表 - 即表名称包含上面数据框中列出的区域名称(例如“Table_D1-NY-1”等)。我想测试上面DataFrame中的Area(索引)和我的数据库中的表的名称之间是否匹配,如果匹配,则将DataFrame的整个相关行写入包含相同Area的表中在名字里。这是我到目前为止所写的内容,以及我得到的错误:

代码:

    ii=0
    for ii in range(0,row_count):
        df_area= df_transpose.index[ii]
        export_data= df_transpose.iloc[ii]
        cur.execute("SELECT name FROM sqlite_master WHERE type='table'")
        available_tables=(cur.fetchall())
        for iii in range (0, row_count):
            if re.match('\w*'+df_area, available_tables[iii]):
                relevant_table=available_tables[iii]
                export_data.to_sql(name=relevant_table, con=con, if_exists=append)
            iii=iii+1

错误:对于“if re.match...”行:

TypeError: expected string or buffer

在搜索问题的解决方案后,我尝试进行第二个 (iii) 循环,以避免将列表对象 (available_tables)(而不是字符串)输入到 re.match()。我仍然得到同样的错误。谁能看到我的错误或帮助我修复我的代码?

编辑: 有关信息,df_areaavailable_tables 输出以下内容:

df_area=
u'D1_NY_1

available_tables=
[(u'US_D1_NY_1',), (u'US_D2_NY_2',), (u'US_D3_NJ_1',), ...]

编辑:

还没有弄清楚这一点,希望能提供意见。我尝试使用我的代码,但错误仍然存​​在。

最终编辑: 以为我会发布我是如何过去的。问题是在available_tables 之前是元组列表,而不是字符串列表。要让 re.match() 测试工作available_tables 必须是一个字符串列表。我使用以下命令进行了更改:

        cur.execute("SELECT name FROM sqlite_master WHERE type='table'")
        available_tables=[item[0] for item in cur.fetchall()]

【问题讨论】:

    标签: python regex database sqlite dataframe


    【解决方案1】:

    无法发表评论,但可以尝试使用 r'\w*' 而不是 '\w',因为您使用的是反斜杠。

    此外,从您给出的输出看来,available_tables 是一个元组列表。所以你可能想使用:

    re.match(r'\w*'+df_area, available_tables[iii][0])
    

    【讨论】:

      猜你喜欢
      • 2011-07-02
      • 1970-01-01
      • 1970-01-01
      • 2020-02-21
      • 2013-07-22
      • 1970-01-01
      • 2013-05-05
      • 1970-01-01
      • 2018-05-16
      相关资源
      最近更新 更多