我大约一周前才开始学习 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 个左右值。在示例中,如果它们不是纽约或加利福尼亚州,我会将它们汇总并将它们放入“其他”类别中。这里的年份是由标准化的日期列表(最初是 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。
有什么方法可以正确格式化它吗?感谢您抽出时间。
最佳答案
我相信您需要通过sum
创建Series
并重命名
它:
final_df = my_df.append(my_df.sum().rename('Total'))
print (final_df)
NY CA Other Total
State
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
另一个解决方案是使用 loc
对于 setting with enlargement
:
my_df.loc['Total'] = my_df.sum()
print (my_df)
NY CA Other Total
State
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
之前答案的另一个想法 - 将参数 margins=True
和 margins_name='Total'
添加到 crosstab
:
df1 = df.assign(**dct)
out = (pd.crosstab(df1['Firing'], df1['State'], margins=True, margins_name='Total'))
关于python - Pandas:使用 Append 添加新列并使另一个全为 NaN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52696170/