【问题标题】:Dropping the index column from DataFrame in a .csv file in Pandas在 Pandas 的 .csv 文件中从 DataFrame 中删除索引列
【发布时间】:2020-11-13 22:10:47
【问题描述】:

我这里有一个 python 脚本:

import pyodbc
import pandas as pd
from sqlalchemy import create_engine 
import csv

df = pd.read_sql("""script_generator""", conn)

for count, row in df.iterrows():
    row.to_csv('generatedfile{}.sql'.format(count), index=False, index_label=False, quoting=csv.QUOTE_NONE, escapechar=' ')

当我运行它时,它会创建以 sql 格式设置的单独的 csv 文件。 generatefile2 中的输出如下所示:

2
IF    EXISTS  (SELECT  *  FROM  sys.objects  WHERE  object_id  =  OBJECT_ID(N'table1')  AND  type  in  (N'U')) 
 
BEGIN 
 
        PRINT  'DROPPING  TABLE  [dbo].[table1]....' 
 
        DROP  TABLE  [dbo].[table1];   
 
END;   

其余文件具有相同的格式。 有什么办法可以更改我的代码以摆脱代码开头的“2”?由于它,它不会在 SQL 中正常运行。由于某种原因 index_label=False 不会摆脱它。 非常感谢!

【问题讨论】:

  • 你知道吗,这可能是一个错误!我确实重现了问题。奇怪的默认 index=Trueindex_label=None 在 .csv 中以逗号开头。考虑在GitHub pandas dev page 上提醒作者。请务必包含带有可运行代码和小数据示例的reproducible example

标签: python sql pandas csv


【解决方案1】:

运行DataFrame.iterrows 时,row 呈现为 Pandas 系列而不是数据框。所以实际上,你正在运行Series.to_csv

for count, row in df.iterrows():
    print(type(row))

# <class 'pandas.core.series.Series'>
# <class 'pandas.core.series.Series'>
# <class 'pandas.core.series.Series'>
...

但是,此方法不适用于迭代单个列。相反,考虑直接在列的值上循环(假设完全是您的 SQL 语句)。在每次迭代中,使用典型的 open + write 方法创建相应的 csv 文件。使用enumerate 对文件后缀进行连续编号。

for count, val in enumerate(df['sql_string_column']):
    with open('generatedfile{}.sql'.format(count), 'w') as f:
        f.write(val)

【讨论】:

  • 感谢您的意见!我能够用你的方法摆脱索引号。我的列没有列名,所以我写道: for i, val in enumerate(df['']): with open('generatedfile{}.sql', 'w') as f: f.write(val ) 但它现在只创建一个 .sql 文件,名为 generatefile{}.sql。有一个空白的列名会搞砸吗?
猜你喜欢
  • 2021-04-14
  • 2017-04-17
  • 2018-12-31
  • 2019-04-22
  • 2013-12-05
  • 2021-10-30
  • 2023-04-05
  • 2018-05-01
相关资源
最近更新 更多