小能豆

Pandas:使用 Append 添加新列并使另一个列全部为 NaN

py

我大约一周前才开始学习 Pandas,现在我一直在努力处理 Pandas 数据框。我的数据如下所示:

State    NY   CA   Other  Total
Year
2003    450   50    25      525
2004    300   75     5      380
2005    500  100   100      700
2006    250   50   100      400 

我从一个数据集中制作了这个表格,其中包含我在此处表示为州的变量的 30 个左右的值。如果它们不是 NY 或 CA,在示例中,我会将它们相加并将它们放在“其他”类别中。这里的年份是根据规范化的日期列表(最初是 mm/dd/yyyy 和 yyyy-mm-dd)制作的,如果这导致了我的问题:

dict = {'Date': pd.to_datetime(my_df.Date).dt.year}

以及之后的版本:

my_df = my_df.rename_axis('Year')

我现在尝试在底部添加一行来显示每个类别的总数:

final_df = my_df.append({'Year' : 'Total',
                         'NY': my_df.NY.sum(), 
                         'CA': my_df.CA.sum(), 
                         'Other': my_df.Other.sum(), 
                         'Total': my_df.Total.sum()}, 
                          ignore_index=True)

从技术上讲这确实可行,但它使我的表格看起来像这样:

         NY   CA   Other  Total  State
0       450   50    25      525    NaN
1       300   75     5      380    NaN
2       500  100   100      700    NaN
3       250   50   100      400    NaN
4         a    b     c        d   Total

(’a’ 等是列的实际总数。)它在开头添加一列,并将我的“年份”列放在末尾。事实上,它还会删除“日期”标签,并将最后一列中的所有年份都变成 NaN。

有什么方法可以正确格式化吗?谢谢您的宝贵时间。


阅读 19

收藏
2024-12-05

共1个答案

小能豆

您遇到的问题主要是因为使用了 append 方法,它会导致 DataFrame 的索引和列发生变化,尤其是在列对齐时。为了避免这种问题,您可以使用 locconcat 来添加总计行,并确保列的顺序不被改变。以下是您的代码的改进版本:

import pandas as pd

# 创建 DataFrame
data = {
    'NY': [450, 300, 500, 250],
    'CA': [50, 75, 100, 50],
    'Other': [25, 5, 100, 100],
    'Total': [525, 380, 700, 400]
}
df = pd.DataFrame(data, index=[2003, 2004, 2005, 2006])
df.index.name = 'Year'

# 计算总计行
total_row = pd.Series(df.sum(), name='Total')

# 将总计行添加到 DataFrame
final_df = pd.concat([df, total_row.to_frame().T])

# 显示结果
print(final_df)

输出结果会是:

      NY  CA  Other  Total
Year                        
2003  450  50     25    525
2004  300  75      5    380
2005  500 100    100    700
2006  250  50    100    400
Total 1500 275    230   2005

解释:

  • total_row = pd.Series(df.sum(), name='Total'): 计算每列的总和并将其转换为 Series,并设置 name='Total',这样它就会作为行添加。
  • pd.concat([df, total_row.to_frame().T]): 使用 concat 将原始的 DataFrame 和 total_row 结合起来,.to_frame().TSeries 转换为行,并进行转置。

这样可以避免在添加行时引入额外的列,并确保数据格式不变。如果您还有其他问题,随时告诉我!

2024-12-05