我大约一周前才开始学习 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。
有什么方法可以正确格式化吗?谢谢您的宝贵时间。
您遇到的问题主要是因为使用了 append 方法,它会导致 DataFrame 的索引和列发生变化,尤其是在列对齐时。为了避免这种问题,您可以使用 loc 或 concat 来添加总计行,并确保列的顺序不被改变。以下是您的代码的改进版本:
append
loc
concat
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])
total_row
.to_frame().T
这样可以避免在添加行时引入额外的列,并确保数据格式不变。如果您还有其他问题,随时告诉我!