Tengo el siguiente DataFrame que contiene una columna que es una lista de elementos dictados:
d = pd.DataFrame([ ['Green', [{'Desc:': 'STERLING GREEN SO'}, {'Sec:': '01'}, {'Lot:': 'L0038'}, {'Block:': 'B0008'}]], ['Apply', [{'Desc:': 'STERLING GREEN SO'}, {'Sec:': '01'}, {'Lot:': 'L0038'}, {'Block:': 'B0008'}]], ['Range', [{'Desc:': 'STERLING GREEN SO'}, {'Sec:': '01'}, {'Lot:': 'L0038'}, {'Block:': 'B0008'}]], ['Peop', [{'Desc:': 'STERLING GREEN SO'}, {'Sec:': '01'}, {'Lot:': 'L0038'}, {'Block:': 'B0008'}]] ], columns=['Name', 'Legal Description'])y quiero transformarlo en un DataFrame simple así:
d = pd.DataFrame([ ['Green', 'STERLING GREEN SO', '01', 'L0038', 'B0008'], ['Apply', 'STERLING GREEN SO', '01', 'L0038', 'B0008'], ['Range', 'STERLING GREEN SO', '01', 'L0038', 'B0008'], ['Peop', 'STERLING GREEN SO', '01', 'L0038', 'B0008'] ], columns=['Name', 'Legal Description', 'Desc', 'Sec', 'Lot', 'Block'])En mi opinión, la solución ideal sería actuar en sentido ascendente y obtener un diccionario o marco de datos con el formato adecuado.
El problema con su lista de diccionarios de una sola clave es que debe fusionarlos. Puede usar una comprensión de diccionario para eso y convertir a Series:
d2 = d['Legal Description'].apply(lambda c: pd.Series({next(iter(x.keys())).strip(':'): next(iter(x.values())) for x in c}) )Luego únase al marco de datos original:
d.drop(columns='Legal Description').join(d2)producción:
Name Desc Sec Lot Block 0 Green STERLING GREEN SO 01 L0038 B0008 1 Apply STERLING GREEN SO 01 L0038 B0008 2 Range STERLING GREEN SO 01 L0038 B0008 3 Peop STERLING GREEN SO 01 L0038 B0008Si es posible, debe discutir sus datos antes de crear el DataFrame. Es más rápido que remodelar el DataFrame después de crearlo. Por ejemplo, algo como
data = [ ['Green', [{'Desc:': 'STERLING GREEN SO'}, {'Sec:': '01'}, {'Lot:': 'L0038'}, {'Block:': 'B0008'}]], ['Apply', [{'Desc:': 'STERLING GREEN SO'}, {'Sec:': '01'}, {'Lot:': 'L0038'}, {'Block:': 'B0008'}]], ['Range', [{'Desc:': 'STERLING GREEN SO'}, {'Sec:': '01'}, {'Lot:': 'L0038'}, {'Block:': 'B0008'}]], ['Peop', [{'Desc:': 'STERLING GREEN SO'}, {'Sec:': '01'}, {'Lot:': 'L0038'}, {'Block:': 'B0008'}]] ] records = [] for name, legal_desc in data: rec = {'Name': name} rec.update(x for d in legal_desc for x in d.items()) records.append(rec) d = pd.DataFrame(records)Producción:
>>> d Name Desc: Sec: Lot: Block: 0 Green STERLING GREEN SO 01 L0038 B0008 1 Apply STERLING GREEN SO 01 L0038 B0008 2 Range STERLING GREEN SO 01 L0038 B0008 3 Peop STERLING GREEN SO 01 L0038 B0008 >>> records [{'Name': 'Green', 'Desc:': 'STERLING GREEN SO', 'Sec:': '01', 'Lot:': 'L0038', 'Block:': 'B0008'}, {'Name': 'Apply', 'Desc:': 'STERLING GREEN SO', 'Sec:': '01', 'Lot:': 'L0038', 'Block:': 'B0008'}, {'Name': 'Range', 'Desc:': 'STERLING GREEN SO', 'Sec:': '01', 'Lot:': 'L0038', 'Block:': 'B0008'}, {'Name': 'Peop', 'Desc:': 'STERLING GREEN SO', 'Sec:': '01', 'Lot:': 'L0038', 'Block:': 'B0008'}]También puedes usar:
df.set_index('Name', inplace=True) df = df['Legal Description'].explode().apply(pd.Series).groupby(level=0).sum().reset_index() OUTPUT
Name Desc: Sec: Lot: Block: 0 Apply STERLING GREEN SO 01 L0038 B0008 1 Green STERLING GREEN SO 01 L0038 B0008 2 Peop STERLING GREEN SO 01 L0038 B0008 3 Range STERLING GREEN SO 01 L0038 B0008