我试图找到陆地面积与水域面积的比率,但当我尝试将这两个数字分开时我得到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
答案 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