划分两个数字时为什么我得到0?

时间:2016-11-01 04:39:35

标签: python sql sqlite pandas dataframe

我试图找到陆地面积与水域面积的比率,但当我尝试将这两个数字分开时我得到0:

import pandas as pd
import sqlite3
import math
conn = sqlite3.connect('factbook.db')
query = "SELECT SUM(area_land ) from facts WHERE area_land != '';"
query2 = "SELECT SUM(area_water) from facts WHERE area_water != '';"
area_land= pd.read_sql_query(query,conn)
#print(area_land.iloc[0])
area_water= pd.read_sql_query(query2,conn)
ratio = area_land.iloc[0]/area_water.iloc[0]
print(ratio)

我是否必须将比率初始化为float类型?

这是两个变量的输出:

SUM(area_land )    128584834                                                    
Name: 0, dtype: int64                                                           
SUM(area_water)    4633425                                                      
Name: 0, dtype: int64   

4 个答案:

答案 0 :(得分:0)

正如评论中所提到的,python 3将执行from __future__ import division因此在划分两个整数时不应该为零。如果它是python 2,您可以将from __future__ import division添加到文件的顶部,或将列设为float area_water.your_column = area_water.your_column.astype(float)

答案 1 :(得分:0)

您将一个整数除以另一个整数。执行此操作时,结果将作为整数传递。例如,1/2 = 0.5,但以整数表示的0.5为0。

将分子或分母中的任何一个或两者转换为 float ,以改为返回浮点数。

答案 2 :(得分:0)

您已选择结果row进行除法,您应使用.iloc[0,0]选择实际值:

ratio = area_land.iloc[0,0] / area_water.iloc[0,0]

答案 3 :(得分:0)

我建议您使用更高效的SQL方法 - 您可以使用单个SQL语句实现目标:

import pandas as pd
import sqlite3

conn = sqlite3.connect(r'd:/temp/test.sqlite3')
query = "select sum(coalesce(area_land,0))*1. / sum(coalesce(area_water,0))*1. as ratio" + \
        " from facts where area_land is not null or area_water is not null"

ratio = pd.read_sql(query, conn).iloc[0, 0]

print('Ratio: {}'.format(ratio))

输出:

Ratio: 0.75

设定:

C:\sqlite3 d:\temp\test.sqlite3
create table facts(area_land int, area_water int);
insert into facts values (NULL, 10);
insert into facts values (10, NULL);
insert into facts values (5, 10);
.quit

数据:

sqlite> .mode column
sqlite> .header on
sqlite> .nullvalue NULL
sqlite> select * from facts;
area_land   area_water
----------  ----------
NULL        10
10          NULL
5           10