python - 用 Pandas 编写单个 CSV header

标签 python pandas csv dataframe header

我正在将数据解析为列表并使用 Pandas 来构建和写入 CSV 文件。首先,我的数据被放入一个集合中,其中 inv、name 和 date 都是包含大量条目的列表。然后我使用 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

counter = True 语句驻留在我正在解析的所有数据的迭代循环之外,因此它不会每次都被覆盖。

所以这意味着它只在我的数据中运行一次以获取第一个 df 集,然后将其连接起来。问题是,即使 counter 仅在第一轮为 True 并且适用于我的第一个 df if 语句,但它不适用于我写入文件。

发生的情况是头被一遍又一遍地写入——不管 counter 只为 True 一次的事实。当我将 header = False 交换为 counter 为 True 时,它​​永远不会写入 header 。

我认为这是因为 df 以某种方式连接到标题上,但除此之外我无法弄清楚逻辑错误。

也许还有另一种方法可以将标题一次且仅一次写入同一个 CSV 文件?

最佳答案

如果没有看到其余的代码,很难判断可能出了什么问题。我开发了一些有效的测试数据和逻辑;您可以对其进行调整以满足您的需求。
请试试这个:

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
或者,您可以连接循环中的所有数据并在最后写出数据帧:
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)
如果您的代码无法符合此 API,您可以完全放弃在 to_csv 中写入 header 。您可以检测输出文件是否存在,如果不存在,则首先将 header 写入其中:
import os

fn = './new.csv'
if not os.path.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)

关于python - 用 Pandas 编写单个 CSV header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48053207/

相关文章:

python - 使用 pip 安装包的最新兼容版本

python - 如何为每个用户 ID 重复一组日期?

python - [ Pandas ] : How to Select a particular Column element corresponding to maximum of another Column element in Pandas?

date - 将 csv 文件的 yyyymmdd 转换为 mm/dd/yyyy

python - 如何更改 matplotlib colorbar 标签的字体属性?

python - Django makemessages 将翻译后的字符串标记为模糊

csv - Python : How to convert . ofx 文件转换为 .csv

java - 同步不适用于计数器?

python - 查找数据帧行中的前 n 个值 (Python)

python - "Expanding Mode"类似于 Pandas "expanding_mean"