我有一些列是浮点数的数据,我想将它们按四舍五入为的整数进行聚合.在下面的MWE中,预期yields 应为

   912
0  2.5
1  1.5

因为所有列元素都四舍五入为912.

MWe:

import pandas as pd
temp = pd.DataFrame({911.7: {0: 0, 1: 1}, 911.9: {0: 2.0, 1: 0.0}, 912.0: {0: 0.5, 1: 0.5}})
round_to = 1
price_digits=1
rounded = [round(round(x / round_to) * round_to, price_digits) for x in temp.columns]
temp.groupby(by=rounded, axis=1).sum()

当实际运行时,traceback将是:

Traceback (most recent call last):
  File "D:\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py", line 3331, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-17-983fbc3f7113>", line 1, in <module>
    temp.groupby(by=rounded, axis=1).sum()
  File "D:\Anaconda3\lib\site-packages\pandas\core\groupby\groupby.py", line 1378, in f
    return self._cython_agg_general(alias, alt=npfunc, **kwargs)
  File "D:\Anaconda3\lib\site-packages\pandas\core\groupby\generic.py", line 1004, in _cython_agg_general
    how, alt=alt, numeric_only=numeric_only, min_count=min_count
  File "D:\Anaconda3\lib\site-packages\pandas\core\groupby\generic.py", line 1033, in _cython_agg_blocks
    block.values, how, axis=1, min_count=min_count
  File "D:\Anaconda3\lib\site-packages\pandas\core\groupby\ops.py", line 587, in aggregate
    "aggregate", values, how, axis, min_count=min_count
  File "D:\Anaconda3\lib\site-packages\pandas\core\groupby\ops.py", line 530, in _cython_operation
    result, counts, values, codes, func, is_datetimelike, min_count
  File "D:\Anaconda3\lib\site-packages\pandas\core\groupby\ops.py", line 608, in _aggregate
    agg_func(result, counts, values, comp_ids, min_count)
  File "pandas\_libs\groupby.pyx", line 464, in pandas._libs.groupby._group_add
ValueError: len(index) != len(labels)

这很令人费解,因为len(rounded)==len(temp.columns)==3.似乎没有长度不匹配的情况.

怎样才是达到我的目的的合适方式?提前谢谢!

Pandas 版:'1.0.1'.Python版本:Python 3.7.6 (default, Jan 8 2020, 16:21:45) [MSC v.1916 32 bit (Intel)].


在大多数情况下,MWE确实有效.例如,当我们将第三个Column元素从912.0更改为912.3时:

import pandas as pd
round_to = 1
price_digits=1
temp = pd.DataFrame({911.7: {0: 0, 1: 1}, 911.9: {0: 2.0, 1: 0.0}, 912.3: {0: 0.5, 1: 0.5}})
rounded = [round(round(x / round_to) * round_to, price_digits) for x in temp.columns]
temp.groupby(by=rounded, axis=1).sum()

输出将为

Out[14]: 
   912
0  2.5
1  1.5

推荐答案

您可以将列表转换为Index:

df = temp.groupby(pd.Index(rounded), axis=1).sum()
print (df)
   912
0  2.5
1  1.5

或传递lambda函数:

rounded = lambda x: round(round(x / round_to) * round_to, price_digits)
df = temp.groupby(rounded, axis=1).sum()
print (df)
   912
0  2.5
1  1.5

Python相关问答推荐

理解Python的二分库:澄清bisect_left的使用

Polars LazyFrame在收集后未返回指定的模式顺序

为什么tkinter框架没有被隐藏?

Matlab中是否有Python的f-字符串等效物

在Wayland上使用setCellWidget时,try 编辑QTable Widget中的单元格时,PyQt 6崩溃

为什么默认情况下所有Python类都是可调用的?

我如何使法国在 map 中完全透明的代码?

driver. find_element无法通过class_name找到元素'""

如果满足某些条件,则用另一个数据帧列中的值填充空数据帧或数组

如何根据一列的值有条件地 Select 前N组?

如何使用Numpy. stracards重新编写滚动和?

如何在Python中使用Pandas将R s Tukey s HSD表转换为相关矩阵''

基于行条件计算(pandas)

Flask Jinja2如果语句总是计算为false&

在pandas/python中计数嵌套类别

Pandas—堆栈多索引头,但不包括第一列

如何根据rame中的列值分别分组值

按条件计算将记录拆分成两条记录

一维不匹配两个数组上的广义ufunc

仅取消堆叠最后三列