我現在經常遇到這個問題:我有一個嵌套的字典(通常來自 API / JSON 有效負載)并且需要展平以作為表格資料使用。
例子:
invoices = [
{
'id': 1,
'currency': 'GBP',
'lines': [
{'line_id': 1, 'product': 'pencils', 'quantity': 100, 'price': 20},
{'line_id': 2, 'product': 'erasers', 'quantity': 50, 'price': 10}
]
},
{
'id': 2,
'currency': 'USD',
'lines': [
{'line_id': 1, 'product': 'TV', 'quantity': 2, 'price': 800}
]
}
]
pd.DataFrame(invoices)給我一個帶有兩行的 DataFrame,即每張發票一個。我可以將其擴展為每行 DataFrame as pd.DataFrame(invoices).explode('lines'),但隨后我在列中有dicts 。lines如何將這些dict鍵拆分/分解為 DataFrame 列?
uj5u.com熱心網友回復:
事實證明,最新版本的 pandas 允許自定義訪問器,您可以使用它來實作這一點:
# create per-line dataframe, as in the question
df = pd.DataFrame(invoices).explode('lines')
pd.concat([
df.drop(columns=['lines']), # remove nested column
df['lines'].dict.explode() # add flattened columns
], axis=1)
為了能夠做到這一點,您首先需要定義.dict訪問器:
@pd.api.extensions.register_series_accessor('dict')
class DictAccessor:
def __init__(self, pandas_obj):
self._obj = pandas_obj
def __getitem__(self, key):
return self._obj.apply(curried.get(key))
def explode(self):
return self._obj.apply(pd.Series)
此訪問器還允許您訪問 中的各個鍵dict,例如:
df = pd.DataFrame(invoices).explode('lines')
# total quantity across all invoices
df['lines'].dict['quantity'].sum()
# total cost per invoice
df.groupby('id').apply(lambda group: group['lines'].dict['price'].sum())
uj5u.com熱心網友回復:
您還可以使用:
后 -
df = pd.DataFrame(invoices).explode('lines')
使用json_normalize()-
pd.json_normalize(df['lines'])
line_id product quantity price
0 1 pencils 100 20
1 2 erasers 50 10
2 1 TV 2 800
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/418933.html
標籤:
