Groupby(group-by,group by)对空Pandas数据帧(数据帧,数据帧)的行为

时间:2014-08-08 15:50:00

标签: sql pandas group-by aggregate dataframe

尝试对包含无法聚合的数据类型的列的数据帧执行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。不可聚合的列可以用空值填充。

现在是否存在这些解决方案中的任何一个?

0 个答案:

没有答案
相关问题