Pandas “pandas is a fast, powerful, flexible and easy to
use open source data analysis and manipulation tool, built on top of the Python
programming language.” 
 You can also use pandas in AutoCAD as a data extraction tool. I’m
just learning pandas myself, thankfully there’s good documentation
In this example, I want to search for all block
references that begin with ‘SPK’,  to
create a takeoff of what sprinkler systems are in this drawing. Then, I’ll use
pandas to combine rows and format the output. I’m just printing the output to
the command line, but it’s simple enough to create a table or export the data
to Excel 
 here's the code
import PyRx as Rx
import PyGe as Ge
import PyGi as Gi
import PyDb as Db
import PyAp as Ap
import PyEd as Ed
import traceback
import pandas as pd
#get the attribues and return them as a list
def getAttValues(ref: Db.BlockReference)->list[str]:
    v = [ref.getBlockName()]
    for attrefid in ref.attributeIds():
        attref = Db.AttributeReference(attrefid)
        match attref.tag():
            case 'PART#':
                v.append(attref.textString())
            case 'DESCRIPTION':
                v.append(attref.textString())
            case _:
                pass
    return v
def PyRxCmd_doit():
    try:
        spkIds = []
        db = Db.curDb()
        #define our columns
        data = {'Name': [],
                'PART#': [],
                'DESCRIPTION': [],
                'QTY': []}
        #search for blocks that start with 'SPK'
        bt = Db.BlockTable(db.blockTableId())
        for name, id in bt.toDict().items():
            if name.startswith('SPK'):
                spkIds.append(id)
        for id in spkIds:
            btr = Db.BlockTableRecord(id)
            for refid in btr.getBlockReferenceIds():
                ref = Db.BlockReference(refid)
                values = getAttValues(ref)
                
                #pandas wants equal length lists
                if len(values) != 3:
                    continue
                
                data['Name'].append(values[0].rstrip('.dwg'))
                data['PART#'].append(values[1])
                data['DESCRIPTION'].append(values[2])
                data['QTY'].append(1) #we know we have one
        #create the dataframe, then group by
        df = pd.DataFrame(data)
        dfgr = df.groupby(['Name', 'PART#', 'DESCRIPTION'],
                         sort=False, as_index=False).agg({'QTY': 'sum'})
        
        print(dfgr.to_string())
    except Exception as err:
        traceback.print_exception(err)
 
 
