【问题标题】:Saving dataframe and additional data in same .csv file with Pandas使用 Pandas 将数据框和其他数据保存在同一个 .csv 文件中
【发布时间】:2016-11-25 12:34:33
【问题描述】:

描述:我有一组参数(par1par2par3par4)和一个数据框df。在此示例中,数据帧的参数和列数分别为 4 和 3,但它们都可以是通用数字。

import pandas as pd
import numpy as np

# list of parameters
par1 = 1.05
par2 = 20
par3 = 50000
par4 = 12315468

# Dataframe
dic = {'A' : ['PINCO','PALLO','TOLLO','FINGO','VOLVA'],
       'B' : [ 4     , 5     , np.nan, 1     , 0],
       'C' : [ 1     , 4     , 8     , 7     , 6]}
df = pd.DataFrame(dic)

我的目标是将这些数据保存在同一个 .csv 文件中,但我不知道该怎么做,因为参数的数量与df 的列数。

我的输出文件必须遵循这个规则:

  • 第一行:参数列表
  • 第二行及之后:数据框的内容

因此它看起来像这样:

问题:您能否提供一种智能高效的方法来获取所需形状的输出文件?

【问题讨论】:

    标签: python csv pandas dataframe save


    【解决方案1】:

    首先创建par1par2par3等参数列表。

    l = [par1, par2, par3, par4]

    然后将列表保存到csv

    filename = 'abc.csv'
    pd.DataFrame(l).T.to_csv(filename, index=False, header=False)
    

    使用python的追加模式将数据框追加到csv中。

    with open(filename, 'a') as f:  # Use append mode.
        df.to_csv(f, index=False, header=False)
    

    【讨论】:

      【解决方案2】:

      您可以先创建参数列表pars,然后用相同的length 覆盖pars 列,最后使用reindex,但值必须是unique

      # list of parameters
      par1 = 1.05
      par2 = 20
      par3 = 50000
      par4 = 12315468
      
      pars = [par1,par2,par3,par4]
      
      # Dataframe
      dic = {'A' : ['PINCO','PALLO','TOLLO','FINGO','VOLVA'],
             'B' : [ 4     , 5     , np.nan, 1     , 0],
             'C' : [ 1     , 4     , 8     , 7     , 6]}
      df = pd.DataFrame(dic)
      
      df.columns = pars[:len(pars) - 1]
      print (df)
        1.05      20.00     50000.00
      0    PINCO       4.0         1
      1    PALLO       5.0         4
      2    TOLLO       NaN         8
      3    FINGO       1.0         7
      4    VOLVA       0.0         6
      
      df = df.reindex(columns=pars)
      print (df)
        1.05         20.00        50000.00     12315468.00
      0       PINCO          4.0            1          NaN
      1       PALLO          5.0            4          NaN
      2       TOLLO          NaN            8          NaN
      3       FINGO          1.0            7          NaN
      4       VOLVA          0.0            6          NaN
      

      另一个可能的解决方案是使用DataFrame 中的concat 从列表pars 创建:

      pars = [par1,par2,par3,par4]
      
      # Dataframe
      dic = {'A' : ['PINCO','PALLO','TOLLO','FINGO','VOLVA'],
             'B' : [ 4     , 5     , np.nan, 1     , 0],
             'C' : [ 1     , 4     , 8     , 7     , 6]}
      df = pd.DataFrame(dic)
      print (df)
      
      df.columns = range(len(df.columns))
      s = pd.DataFrame([pars])
      print (s)
            0   1      2         3
      0  1.05  20  50000  12315468
      
      df1 = pd.concat([s, df], ignore_index=True)
      print (df1)
             0     1      2           3
      0   1.05  20.0  50000  12315468.0
      1  PINCO   4.0      1         NaN
      2  PALLO   5.0      4         NaN
      3  TOLLO   NaN      8         NaN
      4  FINGO   1.0      7         NaN
      5  VOLVA   0.0      6         NaN
      

      EDIT 也可以使用模式aread_csv 中追加:

      filename = 'filename.csv'
      pars = [par1,par2,par3,par4]
      pd.DataFrame([pars]).to_csv(filename, index=False, header=False)
      df.to_csv(filename, index=False, header=False, mode='a')
      

      【讨论】:

      • 我认为他/她不想在最后一列出现NaN。那可能吗 ?我的意思是标题的大小可以与数据的大小不同吗?
      • 嗯,答案不是。
      • 是否可以通过某种方式告诉 concat 函数忽略列名并因此跳过 df.columns 选项来使用第二种方法?
      • 我认为不是,因为concat 对齐数据columns
      • 我更改了参数的一些值,在创建数据框时,我得到一列而不是行...你知道这是怎么可能的吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-25
      • 1970-01-01
      • 2018-10-14
      • 1970-01-01
      • 2018-09-11
      • 1970-01-01
      • 2022-08-12
      相关资源
      最近更新 更多