Pandas聚合函数输出到xlsx文件

3
我有一些与sqlite相关的查询,我已经将它们转换为pandas数据框。我将这些数据框传递给一个函数来获取聚合信息。如何使用该函数的结果填充Excel工作表?也就是说,如何将函数输出转换为数据框?(注意-我正在使用openpyxl创建工作簿)
以下是数据框和函数的代码:
# Nationwide measure statistics
nationwide_measures = pd.read_sql_query("""select state,
          measure_id,
          measure_name,
          score
from timely_and_effective_care___hospital;""", conn)

# Remove the non-numeric string values from 'score'
nationwide_measures1 = nationwide_measures[nationwide_measures['score'].astype(str).str.isdigit()]

# Change score to numeric
nationwide_measures1['score'] = pd.to_numeric(nationwide_measures1['score'])

# Function to grab measure values
def get_stats(group):
    return {'Minimum': group.min(), 'Maximum': group.max(), 'Average': group.mean(), 'Standard Deviation': group.std()}

# Function output    
nationwide_measures1['score'].groupby(nationwide_measures1['measure_id']).apply(get_stats).unstack()

我尝试了:

# Function to grab measure values
def get_stats(group):
    return pd.DataFrame({'Minimum': group.min(), 'Maximum': group.max(), 'Average': group.mean(), 'Standard Deviation': group.std()})

但这返回了“值错误:如果使用所有标量值,则必须传递索引”

我还尝试了:

# Function to grab measure values
def get_stats(group):
    df = pd.DataFrame({'Measure Name': group.columns['measure_name'],'Minimum': group.min(), 'Maximum': group.max(), 'Average': group.mean(), 'Standard Deviation': group.std()}, index = [0])
    return df

但是这会出现错误:“AttributeError: 'Series'对象没有属性'columns'”。

你正在传递所有标量值而没有可迭代对象,因此如果添加 index = [0] ,将得到一个单行数据框。 pd.DataFrame({'Minimum': group.min(), 'Maximum': group.max(), 'Average': group.mean(), 'Standard Deviation': group.std()},index=[0]) - Scott Boston
谢谢@ScottBoston,这个方法很有效!但是我该如何格式化列标题呢?每个标题都被列为('Minimum', 0)等等...另外,我该如何将索引命名为“Measure ID”? - zsad512
哦,没有测试数据。我想你可以尝试 index=group.measure_id.head(1)。 - Scott Boston
可能我说错了,索引正确地作为measure_id...... 我想将生成的数据框的表头更改为('Measure ID', 'Minimum', 'Maximum', 'Average','Standard Deviation'),按照这个顺序,而不是("Index","'Minimum', 0"等)并且没有额外的字符。 - zsad512
nationwide_measures1['score'].groupby(nationwide_measures1['measure_id']).apply(get_stats).unstack().reset_index(level=1, drop=True) - Scott Boston
显示剩余2条评论
1个回答

0
在您的数据框创建语句中,pd.DataFrame行,您传递了所有标量值而没有可迭代对象,因此如果添加index = [0],将得到单行数据框。
pd.DataFrame({'Minimum': group.min(), 'Maximum': group.max(), 'Average': group.mean(), 'Standard Deviation': group.std()},index=[0]) 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接