【问题标题】:Fastest way to append a new row to a pandas data frame将新行附加到熊猫数据框的最快方法
【发布时间】:2020-08-01 08:08:21
【问题描述】:

我想在不使用df.loc 的情况下向熊猫数据框追加一行。我正在寻找类似于列表中使用的.append() 方法的东西。

我目前正在这样做,但我正在寻找不同的解决方案:

stupid_table = pd.DataFrame(columns=['max_depth', 'features'])
for max_depth in np.arange(50, 101):
    new_row = pd.DataFrame({'max_depth':[max_depth], 'features':[10]})
    stupid_table = pd.concat([stupid_table, new_row], axis=0)

我想将new_row 声明为列表或熊猫系列,而不是熊猫数据框。有没有办法使以下语法起作用?

stupid_table = pd.DataFrame(columns=['max_depth', 'features'])
for max_depth in np.arange(50, 101):
    new_row = [max_depth, 10]
    stupid_table = pd.concat([stupid_table, new_row], axis=0)

我特别想这样做,因为我想要追加新行的真实数据框有很多列,我懒得把新行写成字典。我宁愿在列表中输入数字。我经常这样做,更方便的语法会为我的心理健康带来奇迹。

编辑:我不喜欢使用.loc,因为我的 for 循环正在获取 numpy 数组中的每个值。将当前语法切换为 for value in range(len(np.arange(start, stop))) 以使 for 循环使用索引,然后我必须将组合转换为数值,因为在实际示例中,我有大量组合。我不想那样做。

【问题讨论】:

  • 这能回答你的问题吗? Add one row to pandas DataFrame。简短的版本是你可以stupid_table.append([{'max_depth': max_depth, 'features': 10}])。更长的版本是,这是非常低效,您可能应该(1)使用loc,尽管您不喜欢这样做,或者(2)构建一个字典列表,然后将它们转换为pd.DataFrame 最后。
  • 你能解释一下这个操作是什么意思吗?

标签: python pandas dataframe concatenation


【解决方案1】:

与您的描述尽可能接近的解决方案是:

import numpy as np
import pandas as pd

stupid_table = pd.DataFrame(columns=['max_depth', 'features'])
for max_depth in np.arange(50, 101):
    new_row = [max_depth, 10]
    new_df = pd.DataFrame({head: [val] for head, val in zip(stupid_table.columns, new_row)})
    stupid_table = pd.concat([stupid_table, new_df], axis=0)

但是,这并不高效,因为主数据框对象 stupid_table 正在您的主循环内重新分配。理想情况下,您可以保存所有新数据帧以附加到新列表中并最后进行连接。这不包括为新创建的数据帧重置索引,但这样做可能是个好主意。

import numpy as np
import pandas as pd

stupid_table = pd.DataFrame(columns=['max_depth', 'features'])
data_frames = [stupid_table]
for max_depth in np.arange(50, 101):
    new_row = [max_depth, 10]
    data_frames.append(pd.DataFrame({head: [val] for head, val in zip(stupid_table.columns, new_row)}))
stupid_table = pd.concat(data_frames, axis=0)

【讨论】:

    猜你喜欢
    • 2019-10-22
    • 2018-09-29
    • 2021-04-27
    • 1970-01-01
    • 2013-10-23
    • 2023-02-01
    • 2018-02-08
    • 2017-06-13
    • 2014-01-03
    相关资源
    最近更新 更多