大约一周前我刚开始学习熊猫,现在我一直在为熊猫数据帧而苦苦挣扎。我的数据如下所示:
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
我从一个数据集制作了这个表,该数据集包含我在这里表示为 State 的变量的 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
并rename
它:
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'))