首页 > Python > 通过一次附加一行来创建 Pandas 数据帧

通过一次附加一行来创建 Pandas 数据帧

上一篇 下一篇

如何创建一个空的,然后逐个添加行?DataFrame

我创建了一个空的:DataFrame

df = pd.DataFrame(columns=('lib', 'qty1', 'qty2'))

然后我可以在末尾添加一个新行并用以下内容填充单个字段:

df = df._set_value(index=len(df), col='qty1', value=10.0)

它一次仅适用于一个字段。添加新行的更好方法是什么?df

分割线

网友回答:

如果可以预先获取数据框的所有数据,则有一种比追加到数据框更快的方法:

  1. 创建字典列表,其中每个字典对应于一个输入数据行。
  2. 从此列表创建数据框。

我有一个类似的任务,逐行附加到数据框需要 30 分钟,并在几秒钟内从字典列表中创建数据框。

rows_list = []
for row in input_rows:

        dict1 = {}
        # get input row in dictionary format
        # key = col_name
        dict1.update(blah..) 

        rows_list.append(dict1)

df = pd.DataFrame(rows_list)               

分割线

网友回答:

可以使用 ,其中带索引的行将是您在数据帧中指定的位置。df.loc[i]i

>>> import pandas as pd
>>> from numpy.random import randint

>>> df = pd.DataFrame(columns=['lib', 'qty1', 'qty2'])
>>> for i in range(5):
>>>     df.loc[i] = ['name' + str(i)] + list(randint(10, size=2))

>>> df
     lib qty1 qty2
0  name0    3    3
1  name1    2    4
2  name2    2    8
3  name3    2    1
4  name4    9    6

分割线

网友回答:

在向数据帧添加大量行的情况下,我对性能感兴趣。所以我尝试了四种最流行的方法并检查了它们的速度。

性能

  1. 使用 .append (NPE 的答案)
  2. 使用 .loc(弗雷德的答案)
  3. 使用 .loc 和预分配(FooBar 的答案)
  4. 最后使用dict创建数据帧(ShikharDua的答案)

运行时结果(以秒为单位):

方法 1000 行 5000 行 10 000 行
。附加 0.69 3.39 6.78
不带预分配的 .loc 0.74 3.90 8.35
.loc with prealloc 0.24 2.58 8.70
字典 0.012 0.046 0.084

所以我通过字典为自己使用加法。


法典:

import pandas as pd
import numpy as np
import time

del df1, df2, df3, df4
numOfRows = 1000
# append
startTime = time.perf_counter()
df1 = pd.DataFrame(np.random.randint(100, size=(5,5)), columns=['A', 'B', 'C', 'D', 'E'])
for i in range( 1,numOfRows-4):
    df1 = df1.append( dict( (a,np.random.randint(100)) for a in ['A','B','C','D','E']), ignore_index=True)
print('Elapsed time: {:6.3f} seconds for {:d} rows'.format(time.perf_counter() - startTime, numOfRows))
print(df1.shape)

# .loc w/o prealloc
startTime = time.perf_counter()
df2 = pd.DataFrame(np.random.randint(100, size=(5,5)), columns=['A', 'B', 'C', 'D', 'E'])
for i in range( 1,numOfRows):
    df2.loc[i]  = np.random.randint(100, size=(1,5))[0]
print('Elapsed time: {:6.3f} seconds for {:d} rows'.format(time.perf_counter() - startTime, numOfRows))
print(df2.shape)

# .loc with prealloc
df3 = pd.DataFrame(index=np.arange(0, numOfRows), columns=['A', 'B', 'C', 'D', 'E'] )
startTime = time.perf_counter()
for i in range( 1,numOfRows):
    df3.loc[i]  = np.random.randint(100, size=(1,5))[0]
print('Elapsed time: {:6.3f} seconds for {:d} rows'.format(time.perf_counter() - startTime, numOfRows))
print(df3.shape)

# dict
startTime = time.perf_counter()
row_list = []
for i in range (0,5):
    row_list.append(dict( (a,np.random.randint(100)) for a in ['A','B','C','D','E']))
for i in range( 1,numOfRows-4):
    dict1 = dict( (a,np.random.randint(100)) for a in ['A','B','C','D','E'])
    row_list.append(dict1)

df4 = pd.DataFrame(row_list, columns=['A','B','C','D','E'])
print('Elapsed time: {:6.3f} seconds for {:d} rows'.format(time.perf_counter() - startTime, numOfRows))
print(df4.shape)

PS:我相信我的实现并不完美,也许可以做一些优化。

模板简介:该模板名称为【通过一次附加一行来创建 Pandas 数据帧】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【Python】栏目查找您需要的精美模板。

相关搜索
  • 下载密码 lanrenmb
  • 下载次数 187次
  • 使用软件 Sublime/Dreamweaver/HBuilder
  • 文件格式 编程语言
  • 文件大小 暂无信息
  • 上传时间 03-23
  • 作者 网友投稿
  • 肖像权 人物画像及字体仅供参考
栏目分类 更多 >
热门推荐 更多 >
微信图片 单页式简历模板 微信公众平台 自适应 微信素材 微信文章 企业网站 html5 微信模板 响应式
您可能会喜欢的其他模板