【问题标题】:How to convert DataFrame.append() to pandas.concat()?如何将 DataFrame.append() 转换为 pandas.concat()?
【发布时间】:2023-02-18 20:29:45
【问题描述】:

在 pandas 1.4.0 中:append() 已被弃用,文档建议改用 concat()

FutureWarning:frame.append 方法已弃用,将被弃用 在未来的版本中从 pandas 中删除。请改用 pandas.concat。

有问题的代码块:

def generate_features(data, num_samples, mask):
    """
    The main function for generating features to train or evaluate on.
    Returns a pd.DataFrame()
    """
    logger.debug("Generating features, number of samples", num_samples)
    features = pd.DataFrame()

    for count in range(num_samples):
        row, col = get_pixel_within_mask(data, mask)
        input_vars = get_pixel_data(data, row, col)
        features = features.append(input_vars)
        print_progress(count, num_samples)

    return features

这些是我尝试过但没有用的两个选项:

features = pd.concat([features],[input_vars])

pd.concat([features],[input_vars])

这是已弃用并引发错误的行:

features = features.append(input_vars)

【问题讨论】:

    标签: python pandas dataframe append concatenation


    【解决方案1】:

    您可以将循环中生成的 DataFrame 存储在列表中,并在完成循环后将它们与 features 连接起来。

    换句话说,替换循环:

    for count in range(num_samples):
        # .... code to produce `input_vars`
        features = features.append(input_vars)        # remove this `DataFrame.append`
    

    与下面的一个:

    tmp = []                                  # initialize list
    for count in range(num_samples):
        # .... code to produce `input_vars`
        tmp.append(input_vars)                        # append to the list, (not DF)
    features = pd.concat(tmp)                         # concatenate after loop
    

    您当然可以在循环中连接,但只连接一次效率更高。

    【讨论】:

    • 根据个人经验,每个 append 单独花费的时间几乎与整个 concat 花费的时间一样长,因此在最后执行一次可以节省大量时间。
    • 非常不幸的是,他们不赞成对数据帧进行追加。使用我的代码,使用此处所示的临时列表创建数据框会导致我的代码运行速度慢 10 倍。
    【解决方案2】:

    这将“附加”空白 df 并通过使用 concat 选项防止将来出现错误

    features= pd.concat([features, input_vars])
    

    但是,仍然无法访问实际数据和数据结构,这将很难测试复制。

    【讨论】:

    • 在最新版本的官方 Pandas 文档中,您会看到 .append() 已被弃用。 pandas.pydata.org/docs/whatsnew/v1.4.0.html 他们说我应该改用 concat() ,但我无法让它工作。我将继续探索 pandas 文档。
    • 我更新了我的答案以使用 concat 感谢您指出文档抱歉如果我之前错过了它们
    • 这直接修复了操作的错误,例如[features],[input_vars] 应该是 [features, input_vars]。但是,对于像 op 这样的循环,其他答案的效率要高得多。
    【解决方案3】:

    例如,您有一个名为 collector 的数据帧列表,例如对于加密货币,您希望从我们的“收集器”中每个数据场的两个特定列中获取第一行。你做如下

    pd.concat([cap[['Ticker', 'Market Cap']].iloc[:1] for cap in collector] )
    

    【讨论】:

      猜你喜欢
      • 2023-02-21
      • 1970-01-01
      • 1970-01-01
      • 2014-01-17
      • 2010-09-08
      • 2013-09-21
      • 2011-05-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多