【问题标题】:pandas csv to psql: additional column is being generated in output (?)pandas csv to psql:输出中正在生成附加列(?)
【发布时间】:2018-07-11 15:41:09
【问题描述】:

我的 .csv 生成的 psql 数据库正在创建一个额外的列,我不知道为什么...

in.csv:

Box,Color,Contents`  
1,Blue,"thing one [version 1] [dd/mm/yyyy]  
thing two [version 1] [dd/mm/yyyy]  
thing three [version 1] [dd/mm/yyyy]  
2,Red,thing four [version 1] [dd/mm/yyyy]
3,Green,"thing five [version 1] [dd/mm/yyyy]  
thing six [version 1] [dd/mm/yyyy] 

convert.py(已编辑)

## begin imports
import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy_utils import database_exists, create_database
import pandas as pd
import numpy as np
import re
import sys
import csv
import time

## begin cellmaxmod
csv.field_size_limit(sys.maxsize)
maxInt = sys.maxsize
decrement = True
while decrement:
    # decrease the maxInt value by factor 10 
    # as long as the OverflowError occurs.

    decrement = False
    try:
        csv.field_size_limit(maxInt)
    except OverflowError:
        maxInt = int(maxInt/10)
        decrement = True

## begin csv2df
df = pd.read_csv('in.csv', encoding='utf-8', engine='python', na_values=['.'])

## begin df2csv
df.to_csv('out.csv')

## begin csv2psql
class MyDB(object):
    def __init__(self):
        self.params = config()

    def create_new_db(self, newdb):
        user, host, port = self.params['user'], self.params['host'], self.params['port']

        pw = self.params['password']
        url = 'postgresql://{}:{}@{}:{}/{}'
        url = url.format(user, pw, host, port, newdb)

        self.engine = create_engine(url, client_encoding='utf8')
        if not database_exists(self.engine.url):
            create_database(self.engine.url)
        # print(database_exists(engine.url))

def df2postgres(engine, df):
    con = engine.connect()
    df.to_sql(name='data', con=con, if_exists='replace', index=True, chunksize=10)

    return con

if __name__ == '__main__':

    testdb = MyDB()
    testdb.create_new_db('converted')
    engn = testdb.engine
    df = pd.read_csv('out.csv', encoding='utf-8', engine='python', na_values=['.'])
    pd.isnull(df)

out.csv(注意新列):

,Box,Color,Contents
0,1,Blue,"thing one [version 1] [dd/mm/yyyy]
thing two [version 1] [dd/mm/yyyy]
thing three [version 1] [dd/mm/yyyy]
1,2,Red,thing four [version 1] [dd/mm/yyyy]
2,3,Green,"thing five [version 1] [dd/mm/yyyy]
thing six [version 1] [dd/mm/yyyy]

pg4admin psql 数据库截图:

问题:第二列在哪里; "Unnamed: 0" 来自,我如何在创建数据库之前停止它的生成或在 out.csv 中编写安全删除它的脚本?

~tnx.

【问题讨论】:

    标签: python postgresql pandas export-to-csv


    【解决方案1】:

    我的 .csv 生成的 psql 数据库正在创建一个额外的列 我不知道为什么......

    out.csv 中的那一列实际上是数据框索引。要删除它,您必须将index=False 参数值传递给to_csv() 方法。

    df.to_csv('out.csv', index=False)
    

    这将生成您的 out.csv 文件,而无需额外的列。

    希望对你有帮助:)

    【讨论】:

    • 它确实有帮助...谢谢。但我还是有点失落。如果第二列“未命名:0”是索引,那么为什么它的左边有一个索引列,@ col1?我显然正在生成两个索引?生病传递错误,看看我是否只有 1 (或没有?)。 tnx 更新:等一下,我想我现在正在关注。我在没有指定 false 的情况下创建了 csv(因此,我的第一个索引),然后,我也将 index = true 传递给 sql 生成: df.to_sql(name='data', con=con, if_exists='replace', index=True, chunksize=10) 如此自然;两个指标。谢谢。
    • 实际上,您是对的,但现在看来解决方案是 'index_col,如“index_col='Box'”。问题解决了。 (pandas.pydata.org/pandas-docs/stable/generated/…)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    • 2022-01-10
    • 2012-08-14
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    相关资源
    最近更新 更多