python - 汇总 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)
解决方案
解决 #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 这是怎么回事。我不喜欢看太深。
推荐阅读
- events - 为什么这个 libreoffice 编辑控件事件处理程序不起作用
- rest - 基本身份验证不适用于 Azure DEVOPS 中的搜索 API
- c - 检查第一个数字是否包含第二个数字
- php - 是否可以反向搜索表格以快速获取最新数据?
- javascript - 如何在不影响Javascript中日期的情况下捕获和替换字符串中的int和float?
- jakarta-ee - Jakarta EE 模块、组件和容器
- python - 在 Tkinter python 中设置输入文本框大小
- sql - 加入另一个表的最新记录
- javascript - Html : JSON 到不同的单选按钮组
- angular - 如何在Angular中动态加载模板