首页 > 解决方案 > 汇总 DataFrame 列而不删除列

问题描述

我有这个数据框:

>>> 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)

标签: pythonpandassummulti-indextimedelta

解决方案


解决 #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 /耸耸肩 IDK 这是怎么回事。我不喜欢看太深。


推荐阅读