尝试对包含无法聚合的数据类型的列的数据帧执行groupby时,不会在groupby中返回这些列。这似乎没问题,但这是导致我出现问题的地方。当我将SQL查询的结果加载到数据框中时,如果该SQL查询的结果为空,我将得到一个默认值为对象的数据框。对象无法聚合,因此当我执行groupby时,我会返回一个没有列的空数据帧。当我尝试对该数据帧执行操作时,我收到一条错误消息,指出我正在寻找的列不存在。
示例代码:
my_query = '''
select day_of_week, revenue, expenses
from finance
'''
df = pd.read_sql(my_query, my_connection) # gives me an empty dataframe of object types
df = df.groupby('day_of_week').sum().reset_index() # returns empty df with no columns
profit = df.revenue - df.expenses # error
在“利润”行,我收到一条错误消息,指出“'DataFrame'对象没有属性'收入'”,因为该列未在groupby中返回。
如果我的SQL查询返回一个空白数据帧,我希望'profit'为null或其他东西。如果无法聚合这些列,是否应该有groupby的选项来返回空值(或其他)的列?我认为应该有。
作为一种解决方法,有一种方法可以使用浮点数而不是对象来初始化我的数据帧,以便在groupby之后我的其余代码不会导致错误吗?
或者甚至SQL可以返回0而不是什么?
编辑:添加一些可以运行的代码来重现问题
import pandas as pd
import sqlite3 as lite
import sys
finance = ()
# uncomment to load the table with data: won't get the error
# finance = (
# (2, 132, 65),
# (6, 142, 86),
# (3, 183, 34),
# (3, 147, 46)
# )
con = lite.connect('test.db')
cur = con.cursor()
cur.execute("DROP TABLE IF EXISTS finance")
cur.execute("CREATE TABLE finance(day_of_week INT, revenue FLOAT, expenses FLOAT)")
cur.executemany("INSERT INTO finance VALUES(?, ?, ?)", finance)
my_query = '''
SELECT *
FROM finance
'''
df = pd.read_sql(my_query, con)
df_gb = df.groupby('day_of_week').sum().reset_index()
profit = df_gb.revenue - df_gb.expenses # AttributeError thrown here
我认为Pandas read_sql
函数应该创建与SQL表相同类型的空列。我还认为groupby
函数应该有一个参数,可能drop_non_agg
默认为False
。不可聚合的列可以用空值填充。
现在是否存在这些解决方案中的任何一个?