在不删除列的情况下对 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 发生了什么事。我不想看得太深
我有这个数据框:
>>> 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 发生了什么事。我不想看得太深