用熊猫编写单个CSV标头

Hel*_*rth 4 python csv header dataframe pandas

我正在将数据解析为列表,并使用熊猫进行构图并写入CSV文件。首先,我的数据被放入一个集合中,其中invnamedate都是具有大量条目的列表。然后,我使用concat将通过解析的数据集的每次迭代连接成CSV文件,如下所示:

counter = True
data = {'Invention': inv, 'Inventor': name, 'Date': date}

if counter is True:
  df = pd.DataFrame(data)
  df = df[['Invetion', 'Inventor', 'Date']]

else:
  df = pd.concat([df, pd.DataFrame(data)])
  df = df[['Invention', 'Inventor', 'Date']]

  with open('./new.csv', 'a', encoding = utf-8) as f:
    if counter is True:
      df.to_csv(f, index = False, header = True)
    else:
      df.to_csv(f, index = False, header = False)

counter = False
Run Code Online (Sandbox Code Playgroud)

counter = True语句位于我要解析的所有数据的迭代循环之外,因此不会每次都覆盖。

因此,这意味着它仅在我的数据中运行一次即可获取第一个df集,然后再对其进行连接。问题在于,即使counter在第一轮中仅为True并适用于df的第一个if语句,但不适用于我写入文件的情况。

发生的情况是头一次又一次地写入-无论计数器仅一次为True的事实。当我将header = False替换为counter时为True时,则永远不会写入该标头。

我认为这是因为df以某种方式保留了标头的串联,但除此之外,我无法弄清逻辑错误。

可能还有另一种方法,我可以一次只向同一CSV文件写入一次标头吗?

Tom*_*nch 6

在不查看其余代码的情况下很难分辨出出了什么问题。我已经开发了一些有效的测试数据和逻辑。您可以对其进行调整以满足您的需求。

请尝试以下方法:

import pandas as pd

early_inventions = ['wheel', 'fire', 'bronze']
later_inventions = ['automobile', 'computer', 'rocket']

early_names = ['a', 'b', 'c']
later_names = ['z', 'y', 'x']

early_dates = ['2000-01-01', '2001-10-01', '2002-03-10']
later_dates = ['2010-01-28', '2011-10-10', '2012-12-31']

early_data = {'Invention': early_inventions,
    'Inventor': early_names,
    'Date': early_dates}

later_data = {'Invention': later_inventions,
    'Inventor': later_names,
    'Date': later_dates}

datasets = [early_data, later_data]

columns = ['Invention', 'Inventor', 'Date']
header = True
for dataset in datasets:
    df = pd.DataFrame(dataset)
    df = df[columns]
    mode = 'w' if header else 'a'
    df.to_csv('./new.csv', encoding='utf-8', mode=mode, header=header, index=False)
    header = False
Run Code Online (Sandbox Code Playgroud)

或者,您可以连接循环中的所有数据,并在最后写出数据帧:

df = pd.DataFrame(columns=columns)
for dataset in datasets:
    df = pd.concat([df, pd.DataFrame(dataset)])
    df = df[columns]
df.to_csv('./new.csv', encoding='utf-8', index=False)
Run Code Online (Sandbox Code Playgroud)

如果无法使您的代码符合此API,则可以放弃将标头完全写入to_csv中。您可以检测输出文件是否存在,如果不存在,请首先将标头写入其中:

import os

fn = './new.csv'
if not os.exists(fn):
    with open(fn, mode='w', encoding='utf-8') as f:
        f.write(','.join(columns) + '\n')
# now append the dataframe without a header
df.to_csv(fn, encoding='utf-8', mode='a', header=False, index=False)
Run Code Online (Sandbox Code Playgroud)