是Pandas.append()方法的好替代方法,现在它被弃用了?

ozxc1zmp  于 2022-11-27  发布在  其他
关注(0)|答案(8)|浏览(625)

我经常使用下面的方法向 Dataframe 追加一行。我非常喜欢它的一点是它允许你追加一个简单的dict对象。例如:

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

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

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

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

因此,以前的一行代码现在是两行,其中有一个一次性变量和额外的cruft,我在这里创建了新的 Dataframe 。:(有没有一个好的方法来做到这一点,只是使用一个像我在过去的dict(这是不赞成的)?

nue99wik

nue99wik1#

如果需要的话,用字典创建一个列表,然后用df = pd.DataFrame.from_records(your_list)创建一个新的 Dataframe 。列表的“append”方法非常有效,永远不会被弃用。另一方面,由于 Dataframe 的设计,它们经常需要重新创建,并且所有数据都要复制到append上-这就是为什么他们弃用该方法

ndh0cuux

ndh0cuux2#

我也喜欢append方法。但是你可以在一行中用一个dict列表来完成它

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

或者对具有递增索引的DataFrame上的值使用loc和元组

df.loc[len(df), ['a','b']] = 1, 2

或者也许

df.loc[len(df), df.columns] = 3, 4
ff29svar

ff29svar3#

如果要改用concat
append

outputxlsx = outputxlsx.append(df, ignore_index=True)

concat

outputxlsx = pd.concat([outputxlsx, df])
ldfqzlk8

ldfqzlk84#

我也遇到过类似的问题。其他的解决方案对我来说都不太管用。我把这个答案留在这里,作为解决这个问题的一个额外的可能性,因为这是谷歌对某些搜索的第一个结果,我自己至少第二次在这里结束了。
在我的例子中,数据不是一个dict,而只是一组已知参数的值的列表。我希望将参数值作为行添加到 Dataframe 中,因为这样我就可以通过df[parameter]访问一个参数的一系列所有值。
我从一个空DataFrame开始:

parameters = ['a', 'b', 'c', 'd', 'e', 'f']
df = pd.DataFrame(columns=parameters)

df:

a   b   c   d   e   f

使用append,我可以非常方便地添加行,如下所示:

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

df:

a   b   c   d   e   f
row1    1   2   3   4   5   6

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

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

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

drkbr07n

drkbr07n5#

对于那些像我一样想要一个描述性函数而不是大量单行程序的人来说,这里有一个基于上面的@Rafael Gaitan的选项。

def appendDictToDF(df,dictToAppend):
  df = pd.concat([df, pd.DataFrame.from_records([dictToAppend])])
  return df

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

# Appending a row
df= appendDictToDF(df,{ 'a': 1, 'b': 2 })
pxy2qtax

pxy2qtax6#

# Deprecated issue has been resolved

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

# Appending a row
df = df.append({ 'a': 1, 'b': 2 }, ignore_index=True)
print("df column Values :", df)

# Create the new row as its own dataframe
df_new_row = pd.DataFrame.from_records({ 'a': [3], 'b': [4] })
df = pd.concat([df, df_new_row])
print("pd concat with two df's :", df)
nnt7mjpx

nnt7mjpx7#

Python的at()方法使我们能够一次更新一行相对于一列的值。

dataframe.at[index,'column-name']='new value'
wvyml7n5

wvyml7n58#

以前在我的程序中使用 DataFrame.append 时也遇到过这个问题,但现在已经解决了。希望这个代码段能有所帮助。

import pandas as pd
df1=pd.DataFrame(dict_1)

def addData(param1,param2,param3):
    dict_2={"list1":var1, "list2":var2, "list3":var3}
    df2=pdDataFrame(dict_2, index={len(dict_2)+1})
    dfc=pd.concat([df1, df2])
    return dfc

相关问题