创建pandas容器主要包括两部分内容,分别时创建空的DataFrame和对DataFrame添加内容。
注意:创建一个空的DataFrame并在循环中不断将有数据的DataFrame concat或者append在它后面,最终生成一个目标DataFrame的方法并不好,效率低,内存消耗大。正确的方法是新建一个list,将DataFrame 添加入列表,最终一次性concat。如果追求效率,甚至要避免DataFrame作为中间过程存储容器,而是改用dict等更高效的方法。
一、创建空DataFrame
对于以df=pd.DataFrame()形式创建的空表,由于index和Columns的缺失会面临一系列问题。
pandas.DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)
1、不能使用iloc来添加内容(可以使用loc)
df=pd.DataFrame()
df.loc[i, 0] =1
df.loc[i, 1] =2
用iloc会报错 “iloc cannot enlarge its target object”
因为 iloc使用index来定位,但是
对于空表
Empty DataFrame
Columns: []
Index: []
解决方法:使用append的方法,添加字典、列表等。
dict1={"指标1":p[0],"指标2":p[1],"指标3":11}
df=pf.append(dict1,ignore_index=True)
注意必须写上 ignore_index=True,否则会报错。ignore_index=True 参数重新设置索引
Can only append a dict if ignore_index=True
2、不能使用columns来添加内容
df=pd.DataFrame()
df.columns=["指标1","指标1","指标3"]
会报错:Expected axis has 0 elements, new values have 3 elements
因为 df=pd.DataFrame() 创建的Columns: [] 为空
解决方法:df=pd.DataFrame(columns=["指标1","指标2","指标3"])
3、解决上两个问题可以用以下方法创建空表,即在创表时给出索引和列名
df = pd.DataFrame(index=range(9), columns=range(9))
二、创建pandas容器
1、先创建空的dataframe,然后对各列赋值,使用于大量数据情况下,效率较高。但是需要注意行号的变化。
df=pd.DataFrame(columns=["a","b"])#该方法创建时需要创建列名
for j in range(10):
df.at[i, 'a'] = j
df.at[i, 'b'] = j+1
i+=1
2、先创建空DataFrame,然后使用字典作为中间变量存储生成的中间值,然后把字典转换为Series合并到DataFrame。该方法可以避免繁琐的dataframe下标计算,但是效率较低。
方法1、使用Series将字典转换为Series然后concat到DataFrame
逐行添加
df=pd.DataFrame()
for i in range(10):
A={"a":i,"b":i+1}
pf = pd.Series(A).to_frame().transpose()
df = pd.concat([df, pf], axis=0,ignore_index=True)
注意:由于字典A的元素不是列表,因此生成的Series是各key按行排列(Series是一维的必然是这种排列方式,无法转置),如果需要转为按列排列需要先转换为DataFrame,再转置。也可用如下方法。
s = pd.Series([1, 2, 3, 4, 5])
df=pd.DataFrame(s, columns=['numbers'])
逐列添加
df=pd.DataFrame()
for i in range(10):
A={"a":i,"b":i+1}
pf = pd.Series(A)
df = pd.concat([df, pf], axis=1,ignore_index=True)
方法2:使用append,该方法最简单。但是由于append函数即将被弃用,会导致满屏的FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
1、创建DataFrame容器
step1、建立空表
df=pd.DataFrame()
step2、创建dict,每次迭代更新dict
dict1={“指标1”:p[0],“指标2”:p[1],“指标3”:11}
step3、更新df
df=pf.append(dict1,ignore_index=True)
df=pd.DataFrame()
for i in range(10):
A={"a":i,"b":i+1}
df=df.append(A,ignore_index=True)
三、创建列表字典容器,一次性生成DataFrame
该方法可以提升效率,pandas添加数据的性能比不上字典。
1、多个字典合并成一个元素为列表的字典
#dictlist是要合并的dict列表
dictlist=[dict1,dict2,dict3]
#创建空列表字典容器
dictA = {key: [] for key in dict1.keys()}
#将dictlist更新到dicta中
for x in dictlist:
for key in x.keys():
dictA[key].extend(x[key])
#使用dictA创建DataFrame,注意要求dict中各列表的长度一致。
df=pd.DataFrame(dictA)
2、创建和更新元素为列表的字典的方法
dict_pairs={"name":[],"mark_price":[]}
for i in data:
dict_pairs["name"].append(i.name)
dict_pairs["mark_price"].append(i.mark_price)