在不删除列的情况下对 DataFrame 列求和

Sum DataFrame Columns without Dropping Columns

我有这个数据框:

>>> d = pd.DataFrame(
 { "a": [1,1]
 , "b": [2,2]
 , "c": [4,5]
 , "d": [pd.Timedelta(hours=6),pd.Timedelta(hours=7)]
 , "e": [12.1,13.3]
 })
>>> d = d.set_index(["a","b","c"])
>>> d
                    d     e
a b c
1 2 4 0 days 06:00:00  12.1
    5 0 days 07:00:00  13.3
>>> d.dtypes
d    timedelta64[ns]
e            float64
dtype: object

我想要每一列的总和,我需要一个 skipna=True 的版本和一个 skipna=False 的版本。我期待这个,

>>> d.sum(level=["a","b"])
                  d     e
a b
1 2 0 days 13:00:00  25.4

但我明白了。

>>> d.sum(level=["a","b"])
        e
a b
1 2  25.4

已删除一列。

更多信息:

>>> pd.__version__
'1.2.3'
>>> sys.version_info
sys.version_info(major=3, minor=8, micro=8, releaselevel='final', serial=0)

解决 #1 groupby/agg

d.groupby(level=['a', 'b']).agg({'d': 'sum', 'e': 'sum'})

                  d     e
a b                      
1 2 0 days 13:00:00  25.4

解决 #2 apply

d.apply(pd.Series.sum, level=['a', 'b'])

                  d     e
a b                      
1 2 0 days 13:00:00  25.4

请注意,您也可以传递其他参数

d.apply(pd.Series.sum, level=['a', 'b'], skipna=True)

                  d     e
a b                      
1 2 0 days 13:00:00  25.4

解决 #3 groupby/numeric_only=False

根据@QuanhHoang

d.groupby(['a', 'b']).sum(numeric_only=False)

                  d     e
a b                      
1 2 0 days 13:00:00  25.4

不幸的是,d.sum(level=['a', 'b'], numeric_only=False)还是不行。


嗯,我觉得很奇怪!

我认为正在发生的事情是 Pandas 假设它不是数字类型,因此不值得 'sum'

不过,我查了一下

np.issubdtype(d.dtypes.d, np.number)

True

Sooo /shrug IDK 发生了什么事。我不想看得太深