在 Pandas 2.0 中将单行附加到 DataFrame

New*_*bie 5 python dataframe pandas

我有一个 DF 如下。我添加了一个新列,其中包含所有行的总计和一个新行,其中包含所有列的总计:

A  B  C   D   Total
-------------------
1  2   3   4   10
5  6   7   8   26
6  8  10  12   36
Run Code Online (Sandbox Code Playgroud)

现在,我需要再添加一行,其中第一个元素将为 NaN,其余行将是从 Total 行中的前一列中减去的列。

A B C D Total
1 2 3 4 10
5 6 7 8 26
6 8 10 12 36
NaN 2 2 2 24 <--- new row
Run Code Online (Sandbox Code Playgroud)

谢谢

cs9*_*s95 5

这将是 的罕见用例之一df.append,但您可以使用 和 提取最后一行iloc[-1]diff单个值,然后将其与原始值组合起来。

选项 1
执行此连接的一种方法是使用pd.concat

df2 = pd.concat([df, df.iloc[-1].diff().to_frame().T])
print (df2) 

     A    B     C     D  Total
0  1.0  2.0   3.0   4.0   10.0
1  5.0  6.0   7.0   8.0   26.0
2  6.0  8.0  10.0  12.0   36.0
2  NaN  2.0   2.0   2.0   24.0
Run Code Online (Sandbox Code Playgroud)

在哪里,

df.iloc[-1].diff().to_frame().T # dataframe with 1 row

    A    B    C    D  Total
2 NaN  2.0  2.0  2.0   24.0
Run Code Online (Sandbox Code Playgroud)

选项 2
另一种使用就地赋值的方法loc

df.loc[len(df.index)] = df.iloc[-1].diff()
print (df)

     A    B     C     D  Total
0  1.0  2.0   3.0   4.0   10.0
1  5.0  6.0   7.0   8.0   26.0
2  6.0  8.0  10.0  12.0   36.0
3  NaN  2.0   2.0   2.0   24.0
Run Code Online (Sandbox Code Playgroud)

在哪里,

df.iloc[-1].diff()  # series

A         NaN
B         2.0
C         2.0
D         2.0
Total    24.0
Name: 2, dtype: float64
Run Code Online (Sandbox Code Playgroud)

选项 3
这是一个与字典 和 有点乐趣的选项pd.DataFrame

pd.DataFrame([*df.to_dict('records'), df.iloc[-1].diff().to_dict()])

     A    B     C     D  Total
0 1.00 2.00  3.00  4.00  10.00
1 5.00 6.00  7.00  8.00  26.00
2 6.00 8.00 10.00 12.00  36.00
3  NaN 2.00  2.00  2.00  24.00
Run Code Online (Sandbox Code Playgroud)

选项 4 [已弃用]
在旧版本 (pandas <= 1.4) 上,我建议使用append如下方式:

df2 = df.append(df.iloc[-1].diff(), ignore_index=True)
Run Code Online (Sandbox Code Playgroud)