使用 Pandas 将数据框和其他数据保存在同一个 .csv 文件中
Posted
技术标签:
【中文标题】使用 Pandas 将数据框和其他数据保存在同一个 .csv 文件中【英文标题】:Saving dataframe and additional data in same .csv file with Pandas 【发布时间】:2016-11-25 12:34:33 【问题描述】:描述:我有一组参数(par1
、par2
、par3
、par4
)和一个数据框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
的列数。
我的输出文件必须遵循这个规则:
第一行:参数列表 第二行及之后:数据框的内容因此它看起来像这样:
问题:您能否提供一种智能高效的方法来获取所需形状的输出文件?
【问题讨论】:
【参考方案1】:首先创建par1
、par2
、par3
等参数列表。
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 也可以使用模式a
在read_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
我更改了参数的一些值,在创建数据框时,我得到一列而不是行...你知道这是怎么可能的吗?以上是关于使用 Pandas 将数据框和其他数据保存在同一个 .csv 文件中的主要内容,如果未能解决你的问题,请参考以下文章