创建pandas容器和添加数据

创建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)

你可能感兴趣的:(Python常用小框架,pandas,python,数据分析)