【问题标题】:Filtering Pandas PivotTable过滤 Pandas 数据透视表
【发布时间】:2018-03-31 15:48:36
【问题描述】:

我正在尝试通过 SQL 查询向 Pandas 提供一些数据,然后将旋转后的结果保存到 .csv 文件中。到目前为止,我已经成功了。

import cx_Oracle
import pandas as pd

query = """
        SELECT 
            dt,
            --Workstack, 
            GM, 
            COUNT(JOB_NUMBER)
        FROM MY_TABLE
        GROUP BY 
            dt, 
            --Workstack, 
            GM
"""

connection = cx_Oracle.connect("<My_Username>", "<My Password>", "<Database String>")
df = pd.read_sql_query(query, connection)
piv = df.pivot(index='GM', columns='DT', values='COUNT')
print (piv.head())

piv.to_csv('''Workstack.csv''')

现在我希望在查询变量中包含使用的字段“Workstack”,并且我还想使用 pandas 过滤具有字段 Workstack 的不同字符串,然后将它们粘贴为不同的 csv 文件或同一个 Excel 文件。但是,当我在查询中包含 Workstack 时,python 给了我这个错误......

ValueError: Index contains duplicate entries, cannot reshape

任何想法我如何解决这个问题?最终,我想使用 python Excel 模块将上述数据透视表粘贴到不同的单元格和工作表上。

谢谢:)

【问题讨论】:

  • 尝试在旋转之前重置索引:df.reset_index().pivot

标签: python excel pandas pivot-table


【解决方案1】:

试试pivot_table的聚合功能:

piv = df.pivot_table(index='GM', columns='DT', values='COUNT', aggfunc='sum')

【讨论】:

  • 或 groupby () ;)
  • 非常感谢您的帮助!无论如何,我可以通过过滤不同的“Workstack”值来创建更多的数据透视表吗?
  • 是的,df.query('Workstack == 5).pivot_table(index='GM', columns='DT', values='COUNT', aggfunc='sum')
  • 嗨,斯科特,由于某种原因,这不起作用,我不得不使用 PivotTable = df.loc[df['ColumnName'] == "ValueinColumn"]
  • @RyanDavies。很好,您应该能够使用“查询”,它比使用布尔索引更具可读性,就像您在这里所做的那样。如果我的解决方案对您有帮助,您介意accepting it吗?
【解决方案2】:
import cx_Oracle
import pandas as pd

query = """SELECT * FROM MY_TABLE"""

print('Loading Query')

connection = cx_Oracle.connect("Username", "Password", "Data Connection")
df = pd.read_sql_query(query, connection)

PivotTable = df.loc[df['ColumnName'] == "ValueinColumn"].pivot_table(index='SelectRows', columns='SelectColumns', values='SelectValues', aggfunc='SelectAggregation')

print ("Writing to Excel")

ExcelWorkbook = pd.ExcelWriter('Data.xlsx')
PivotTable.to_excel(ExcelWorkbook,  sheet_name='PivotTable', startrow=1)
ExcelWorkbook.save()

print ("Closing Connection")
connection.close()

print('Section Complete')

【讨论】:

    猜你喜欢
    • 2016-07-08
    • 2023-02-24
    • 2019-05-21
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    相关资源
    最近更新 更多