本文介绍: 创建pandas容器主要包括两部内容,分别时创建空的DataFrame和对DataFrame添加内容。

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

原文地址:https://blog.csdn.net/A41915460/article/details/129247178

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_20132.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注