df.append()没有将数据附加到DataFrame中。

26

我提出了这个问题,关于如何添加带有索引的行,但当没有索引时,我还不清楚是如何发生的。

columnsList=['A','B','C','D']
df8=pd.DataFrame(columns=columnsList)
L=['value aa','value bb','value cc','value dd']
s = pd.Series(dict(zip(df8.columns, L)))
df8.append(s,ignore_index=True)
df8.append(s,ignore_index=True)

我期望这里有一个 2x4 的数据框架。 然而,没有添加任何值,也没有出现错误。

print(df8.shape)
#>>> (0,4)

为什么这个系列没有被添加,而且也没有给出任何错误信息?


如果我尝试添加一行带有LOC的数据,索引就会被添加,

df8.loc[df8.index.max() + 1, :] = [4, 5, 6,7]
print(df8)

结果:

     A  B  C  D
NaN  4  5  6  7

我猜LOC和iLOC都不能用于添加没有索引名称的行(即,Loc会添加索引名称NaN,而当索引号大于数据库中的行数时,iLoc无法使用)

2个回答

58

pandas >= 1.4

已弃用DataFrame.append, 建议使用pd.concat

请注意,在您的示例中,您正在连接两个序列,因此沿axis=1连接并转置。

df = pd.concat([s, s], axis=1).T
df

          A         B         C         D
0  value aa  value bb  value cc  value dd
1  value aa  value bb  value cc  value dd

旧版本

DataFrame.append 不是一个原地操作。从文档中可以看到,

DataFrame.append(other, ignore_index=False, verify_integrity=False, sort=None)

Append rows of other to the end of this frame, returning a new object. Columns not in this frame are added as new columns.

你需要将结果分配回去。
df = df8.append([s] * 2, ignore_index=True)
df
          A         B         C         D
0  value aa  value bb  value cc  value dd
1  value aa  value bb  value cc  value dd

9
“你需要将结果重新赋值。”这句话拯救了我的生命。 - Prashant
1
@SeanMcCarthy 在哪里可以看到 df.append 是原地操作的?我对于 inplace=True 是否真正有益于 API 有强烈的看法。请参见这里 - cs95
1
@cs95 你说得对。我误读了文档中的示例...我的错。实际上,它必须被分配给一个变量,不能在原地完成。如果可以在原地完成,那么可能会有一个inplace=True的参数,就像其他Pandas方法一样。 - Sean McCarthy
请注意,此方法已被弃用。请参阅文档 - Muhammad Yasirroni
@MuhammadYasirroni 谢谢,已更新答案以反映此事。 - cs95

13

语句data.append(sub_data)本身无效

但是语句data=data.append(sub_data)会起作用

重新赋值解决了我的问题。这是一个在其他地方找不到的好技巧。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接