将某些pandas结果分组到单个Excel选项卡中

时间:2018-04-03 18:48:13

标签: python excel pandas

我正在编写一个连接到Teradata DB的脚本,从单个表中读取数据,并在该表上运行一些分析。

我在下面的脚本(这个问题的通用)在大多数情况下工作正常,但我有2个问题......

  1. 如何将部分结果合并到一个标签上?例如MIN和MAX,目前被分成他们自己的标签(因为我不知道如何做到这一点)。我想要的是那些组合在一个标签中,列A列出列,列B有MIN值列C有MAX值。
  2. 与显示的2个NULL检查相同

    1. 看起来像一个简单的问题,但是如何将底部的行计数导出到与其自己的标签相同的Excel表格?这会引发错误" int没有对象to_excel'
    2. 由于

      编辑弄清楚问题1.我刚补充说:

      startcol=0
      

      startcol=1 
      

      并将它们添加到同一张表中

      import teradata 
      
      import pandas as pd
      
      
      def main():
      
      
          writer = pd.ExcelWriter('table_results.xlsx', engine='xlsxwriter')
          udaExec = teradata.UdaExec(appName="test", version="1.0", logConsole=True)
      
          def func_1():
      
              #connect to Teradata and run SELECT statement on single table
              with udaExec.connect(method="odbc", dsn="xxx", username="xxx", password="xxx") as session:
                  query = "Select * from TableA"
      
                  # read in records
                  df = pd.read_sql(query, session)
      
                  # print top 20 records
                  head = df.head(20)
                  head.to_excel(writer, sheet_name='Top_20')
      
                  # columns with NULL values -- returns True/False
                  null_columns = df.isnull().any()
                  null_columns.to_frame(name='HasNullValues').to_excel(writer, sheet_name='Null_Columns')
      
                  # count of NULL values per column
                  null_columns_sum = df.isnull().sum()
                  null_columns_sum.to_frame(name='NumNullValues').to_excel(writer, sheet_name='Null_Column_Count')
      
                  # max value per numeric column
                  max_val = df.max(numeric_only=True)
                  max_val.to_frame(name='max').to_excel(writer, sheet_name='Max_Val')
      
                  # min value per numeric column
                  min_val = df.min(numeric_only=True)
                  min_val.to_frame(name='max').to_excel(writer, sheet_name='Min_Val')
      
                  # count of records -- how to export this to the excel file as it's own tab?  --this errors out
                  record_count = df.shape[0]
                  record_count.to_excel(writer, sheet_name='Count')
      
      
                  writer.close()
      
      
      
      
          func_1()
      
      if __name__ == "__main__":
          main()
      

1 个答案:

答案 0 :(得分:3)

对于第一个,您应该创建一个包含min和max的新数据框,复制索引(如果需要):

min_max_df = pd.DataFrame(index=df.index)
min_max_df["min"] = df.min(numeric_only=True)
min_max_df["max"] = df.max(numeric_only=True)

如果使用startrow参数:

,您还可以将多个数据帧写入同一工作表
max_val = df.max(numeric_only=True)
max_val.to_frame(name='max').to_excel(writer, sheet_name='Min_Max')

min_val = df.min(numeric_only=True)
min_val.to_frame(name='max').to_excel(writer, sheet_name='Min_Max', startrow=df.shape[0] + 3)

其他几个例子在这篇非常好的文档中: http://xlsxwriter.readthedocs.io/working_with_pandas.html

对于第二个,作者是XlsxWriter对象,因此您可以更新所需单元格的工作表。这应该工作(未经测试):

min_max_sheet = writer.get_worksheet_by_name("Min_Max")
min_max_sheet.write(df.shape[0] * 2 + 5, "{} rows".format(df.shape[0]))