Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在csv写入中插入第二个标题行_Python_Csv_Pandas_Export To Csv - Fatal编程技术网

Python 如何在csv写入中插入第二个标题行

Python 如何在csv写入中插入第二个标题行,python,csv,pandas,export-to-csv,Python,Csv,Pandas,Export To Csv,我有一个非常大的问题,我正在写给csv。我需要添加第二个包含数据类型的标题行。下面的代码可以工作,但会在CSV中生成第三个意外的空行: #! /usr/bin/env python import pandas as pd df = pd.DataFrame([[1, 2], [3, 4]], columns=list('AB')) # get count of header columns, add REAL for each one types_header_for_insert = li

我有一个非常大的问题,我正在写给csv。我需要添加第二个包含数据类型的标题行。下面的代码可以工作,但会在CSV中生成第三个意外的空行:

#! /usr/bin/env python
import pandas as pd

df = pd.DataFrame([[1, 2], [3, 4]], columns=list('AB'))

# get count of header columns, add REAL for each one
types_header_for_insert = list(df.columns.values)
for idx, val in enumerate(types_header_for_insert):
    types_header_for_insert[idx] = 'REAL'

# count number of index columns, then add STRING for each one
index_count = len(df.index.names)
for idx in range(0, index_count):
    df.reset_index(level=0, inplace=True)
    types_header_for_insert.insert(0, 'STRING')

# insert the new types column
df.columns = pd.MultiIndex.from_tuples(zip(df.columns, types_header_for_insert))

print df.columns.values

df.to_csv("./test.csv", index=False)
输出:

index,A,B
STRING,REAL,REAL
,,
0,1,2
1,3,4
我怎样才能摆脱这个多余的空白行?它是从哪里来的?

我想它是bug,请看

可能有帮助的小技巧-在数据的第一行之前添加插入的
types\u header\u

#! /usr/bin/env python
import pandas as pd

df = pd.DataFrame([[1, 2], [3, 4]], columns=list('AB'))

# get count of header columns, add REAL for each one
types_header_for_insert = list(df.columns.values)
for idx, val in enumerate(types_header_for_insert):
    types_header_for_insert[idx] = 'REAL'

# count number of index columns, then add STRING for each one
index_count = len(df.index.names)
for idx in range(0, index_count):
    df.reset_index(level=0, inplace=True)
    types_header_for_insert.insert(0, 'STRING')

# insert the new types column
#df.columns = pd.MultiIndex.from_tuples(zip(df.columns, types_header_for_insert))

#set new value to dataframe
df.loc[-1]  = types_header_for_insert

#sort index 
df = df.sort_index()
print df
#     index     A     B
#-1  STRING  REAL  REAL
# 0       0     1     2
# 1       1     3     4

print df.to_csv(index=False)
#index,A,B
#STRING,REAL,REAL
#0,1,2
#1,3,4
编辑

在大型df中,您可以使用:


在Python 3中,
MultiIndex.from_tuples()
失败,类型为'zip'的对象没有len()。但是,在
list()
中包装zip不会出现空行。考虑在Python 2中尝试:

df.columns = pd.MultiIndex.from_tuples(list(zip(df.columns, types_header_for_insert)))

print df.columns.values

df.to_csv("./test.csv", index=False)

#   index    A    B
#  STRING REAL REAL
#       0    1    2
#       1    3    4
或者,要使用列表理解环绕
zip

data = [df.columns, types_header_for_insert]
newcolumns = [tuple(i[j] for i in data) for j in range(min(len(l) for l in data))]
df.columns = pd.MultiIndex.from_tuples(newcolumns)

print df.columns.values

df.to_csv("./test.csv", index=False)

#   index    A    B
#  STRING REAL REAL
#       0    1    2
#       1    3    4

我在结尾使用了一个变通方法(a)将原始标题写入csv(b)用第二个标题行替换标题,并将整个df附加到第一个文件:

# write the header to the file only
pd.DataFrame(data=[df.columns]).to_csv("outfile.csv", header=False, index=False)

# now replace header
types_header_for_insert = list(df.columns.values)
for idx, val in enumerate(df.columns.values):
    if df[val].dtype == 'float64':
        types_header_for_insert[idx] = 'REAL'

    elif self.grouped[val].dtype == 'int64':
        types_header_for_insert[idx] = 'INTEGER'

    else:
        types_header_for_insert[idx] = 'STRING'

df.columns = types_header_for_insert

# append the whole df with new header
df.to_csv("outfile.csv", mode="a", float_format='%.3f', index=False)

可以,但在具有更复杂多键索引的大型表上,排序操作效率不高(为我的数据帧排序需要30分钟)。在这种情况下,用单个行创建一个新的数据框,然后合并,而不是追加和排序可能会更有效。列表(ZIP())的第一个方法仍然给我在大熊猫中的空白行0.16.1-由于各种原因,我不能在他的观点上更新。jezrael将这个已知的bug称为原因-。第二种方法也不走运-使用zip避免这种方法仍然会产生第三行空行,就像我的第一个代码片段“,”中一样。这是什么pd版本的?
# write the header to the file only
pd.DataFrame(data=[df.columns]).to_csv("outfile.csv", header=False, index=False)

# now replace header
types_header_for_insert = list(df.columns.values)
for idx, val in enumerate(df.columns.values):
    if df[val].dtype == 'float64':
        types_header_for_insert[idx] = 'REAL'

    elif self.grouped[val].dtype == 'int64':
        types_header_for_insert[idx] = 'INTEGER'

    else:
        types_header_for_insert[idx] = 'STRING'

df.columns = types_header_for_insert

# append the whole df with new header
df.to_csv("outfile.csv", mode="a", float_format='%.3f', index=False)