Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在无舍入误差的情况下以熊猫为单位相乘列_Python_Pandas_Multiplication - Fatal编程技术网

Python 在无舍入误差的情况下以熊猫为单位相乘列

Python 在无舍入误差的情况下以熊猫为单位相乘列,python,pandas,multiplication,Python,Pandas,Multiplication,我需要在不存在舍入误差的情况下对熊猫中的列进行乘法(保持总数相同) 所以我有一个数据帧(称为combined_df),它看起来像: | areaid | districtid | percent | home | job | | 89012 | 55 | 1.0 | 70 | 20 | | 123048 | 442 | 0.984496| 100 | 10 | | 123048 | 34536 | 0.015504| 100 | 10

我需要在不存在舍入误差的情况下对熊猫中的列进行乘法(保持总数相同)

所以我有一个数据帧(称为combined_df),它看起来像:

| areaid | districtid | percent | home | job |
|  89012 | 55         | 1.0     | 70   | 20  |
| 123048 | 442        | 0.984496| 100  | 10  |
| 123048 | 34536      | 0.015504| 100  | 10  |
areaid

-城市内部较小的区域
-例如,在区域ID 123048中:100人是居民,10人工作

地区ID

-城市内部更大的区域
-例如,
areaid
位于两个区442和34536内

我需要计算每个地区的居民和上班人数(结果应该是整数)。我们可以假设人们均匀地分布在每个区域内,因此只需将百分比列与家庭/工作列相乘,然后按
districtid
列进行分组即可

我所做的:

def count_people(percent, people):
    return np.around(percent * people)

result = pd.DataFrame()
result['districtid'] = combined_df['districtid']
result['area_district_home'] = count_people(combined_df['percent'], combined_df['home'])
result['area_district_job'] = count_people(combined_df['percent'], combined_df['job'])
# total residents:
total_home = sum(result.groupby('districtid')['area_district_home'].sum())
但是,如果我将所有居民相加,它们将不等于
areaid
中的所有居民。我认为这是由于舍入误差造成的。误差将非常小(1900万人口为17 ppl)


是否有更准确地计算每个地区的居民和工人的方法?此时,我不确定为什么会出现这种舍入错误,因为如果将0.984496*100舍入为98,那么0.015504*100应该舍入为2,并且总和将相等。

Python有一个内置的round()函数,该函数接受两个数值参数n和ndigit,并返回n舍入为ndigit的数字。ndigits参数默认为零,因此省略它会导致一个四舍五入为整数的数字。正如您将看到的,round()可能并不像您期望的那样工作。

可能我需要一些自定义算法来计算我想要的,但我不知道从哪里开始,a尝试了一些自定义舍入,如:
math.floor(num+0.5)
但没有帮助。您只使用熊猫吗?是的,有更好的工具吗?