既然 Pandas .append() 方法已被弃用,那么它是替代 Pandas 的好方法吗?

Gle*_*enn 156 python dataframe pandas data-munging data-wrangling

我经常使用以下方法将单行附加到数据帧。我真正喜欢它的一件事是它允许您附加一个简单的 dict 对象。例如:

# Creating an empty dataframe
df = pd.DataFrame(columns=['a', 'b'])

# Appending a row
df = df.append({ 'a': 1, 'b': 2 }, ignore_index=True)
Run Code Online (Sandbox Code Playgroud)

同样,我最喜欢的一点是代码非常干净并且只需要很少的行。现在我想推荐的替代方案是:

# Create the new row as its own dataframe
df_new_row = pd.DataFrame({ 'a': [1], 'b': [2] })
df = pd.concat([df, df_new_row])
Run Code Online (Sandbox Code Playgroud)

因此,之前的一行代码现在变成了两行,其中包含一个一次性变量和额外的内容,我在其中创建新的数据框。:( 有没有一种好方法可以做到这一点,只需使用像我过去那样的字典(未弃用)?

jsb*_*eno 68

如果需要的话,使用字典创建一个列表,然后使用df = pd.DataFrame.from_records(your_list). List 的“append”方法非常高效,并且永远不会被弃用。另一方面,由于其设计原因,数据帧经常需要重新创建并将所有数据复制到附加上 - 这就是他们不推荐使用该方法的原因

  • 我同意 ; 不过,当您使用append方法(1.4.0)时,您会遇到“FutureWarning:frame.append方法已弃用,并将在未来版本中从pandas中删除。请改用pandas.concat”。您将在[“新增内容”页面](https://pandas.pydata.org/docs/dev/whatsnew/v1.4.0.html#deprecated-frame-append-and-series-append) 中找到详细信息 (7认同)
  • 这实际上就是他们弃用“df.append”的原因。为此感谢 Pandas 维护者。尽管如此,“新的实现方式”在他们的文档中肯定应该更加突出。 (3认同)
  • 您怎么知道它已被弃用?在 https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.append.html#pandas.DataFrame.append (当前显示版本 1.4.0)我没有看到任何提及。即使在开发树中,我也没有看到任何弃用警告:https://pandas.pydata.org/docs/dev/reference/api/pandas.DataFrame.append.html (2认同)
  • 我听说append() 会将字典插入到具有命名列的现有数据帧的正确对应的数据帧列中。鉴于此, from_records() 能够做同样的事情吗? (2认同)

Raf*_*tan 67

我也喜欢追加方法。但你可以用一系列字典来完成

df = pd.concat([df, pd.DataFrame.from_records([{ 'a': 1, 'b': 2 }])])
Run Code Online (Sandbox Code Playgroud)

或使用 loc 和元组作为具有增量升序索引的 DataFrame 上的值

df.loc[len(df), ['a','b']] = 1, 2
Run Code Online (Sandbox Code Playgroud)

或者可能

df.loc[len(df), df.columns] = 3, 4
Run Code Online (Sandbox Code Playgroud)

  • 您还可以使用ignore_index `df = pd.concat([df, pd.DataFrame.from_records([{ 'a': 1, 'b': 2 }])],ignore_index=True)` (9认同)

小智 35

如果你想改用concat

append

outputxlsx = outputxlsx.append(df, ignore_index=True)
Run Code Online (Sandbox Code Playgroud)

concat

outputxlsx = pd.concat([outputxlsx, df], ignore_index=True)
Run Code Online (Sandbox Code Playgroud)

  • `outputxlsx = pd.concat([outputxlsx, df])` 就足够了,因为 `df` 是一个数据帧。 (6认同)

DrM*_*key 10

对于那些像我一样想要描述性功能而不是大量俏皮话的人来说,这里有一个基于上面@Rafael Gaitan 的选项。

def append_dict_to_df(df, dict_to_append):
    df = pd.concat([df, pd.DataFrame.from_records([dict_to_append])])
    return df

# Creating an empty dataframe
df = pd.DataFrame(columns=['a', 'b'])

# Appending a row
df = append_dict_to_df(df,{ 'a': 1, 'b': 2 })
Run Code Online (Sandbox Code Playgroud)


Nic*_*ico 9

我面临着类似的问题。其他解决方案并不真正适合我。我将这个答案留在这里作为处理该问题的额外可能性,因为这是某些搜索的第一个谷歌结果,而我自己至少是第二次在这里结束。

就我而言,数据不是字典,而只是一组已知参数的值列表。我想将参数值作为行添加到数据帧中,因为这样我可以通过 df[parameter] 访问一个参数的一系列所有值。

我从一个空的 DataFrame 开始:

parameters = ['a', 'b', 'c', 'd', 'e', 'f']
df = pd.DataFrame(columns=parameters)
Run Code Online (Sandbox Code Playgroud)

df:

        a   b   c   d   e   f
Run Code Online (Sandbox Code Playgroud)

通过追加,我可以非常方便地添加行,如下所示:

new_row = pd.Series([1,2,3,4,5,6], index=parameters, name='row1')
df.append(new_row)
Run Code Online (Sandbox Code Playgroud)

df:

        a   b   c   d   e   f
row1    1   2   3   4   5   6
Run Code Online (Sandbox Code Playgroud)

使用 pd.concat 我发现它以非常相似的方式提供相同的结果:

new_row = pd.DataFrame([1,2,3,4,5,6], columns=['row1'], index=parameters).T
df = pd.concat((df, new_row))
Run Code Online (Sandbox Code Playgroud)

关键是从一维数据创建一个 (1,n) 数据帧,然后转置它以匹配其他数据帧。