我在類似于下面的資料框中有資料。我正在嘗試展平資料,以便 JSON blob 中的值轉換為列,如果 JSON blob 中有多個記錄,它會創建一個新行。我想保留非 JSON 欄位(即 ID)。
我特別關注:如何用一些列作為json來展平熊貓資料框?- 但在執行后,我使用未決議的 JSON 的相同資料幀失敗。以下是該帖子中的功能片段,之前對我有用:
def flatten_nested_json_df(df):
df = df.reset_index()
print(f"original shape: {df.shape}")
print(f"original columns: {df.columns}")
# search for columns to explode/flatten
s = (df.applymap(type) == list).all()
list_columns = s[s].index.tolist()
s = (df.applymap(type) == dict).all()
dict_columns = s[s].index.tolist()
print(f"lists: {list_columns}, dicts: {dict_columns}")
while len(list_columns) > 0 or len(dict_columns) > 0:
new_columns = []
for col in dict_columns:
print(f"flattening: {col}")
# explode dictionaries horizontally, adding new columns
horiz_exploded = pd.json_normalize(df[col]).add_prefix(f'{col}.')
horiz_exploded.index = df.index
df = pd.concat([df, horiz_exploded], axis=1).drop(columns=[col])
new_columns.extend(horiz_exploded.columns) # inplace
for col in list_columns:
print(f"exploding: {col}")
# explode lists vertically, adding new columns
df = df.drop(columns=[col]).join(df[col].explode().to_frame())
new_columns.append(col)
# check if there are still dict o list fields to flatten
s = (df[new_columns].applymap(type) == list).all()
list_columns = s[s].index.tolist()
s = (df[new_columns].applymap(type) == dict).all()
dict_columns = s[s].index.tolist()
print(f"lists: {list_columns}, dicts: {dict_columns}")
print(f"final shape: {df.shape}")
print(f"final columns: {df.columns}")
return df
任何幫助表示贊賞!
| ID | 特性 | 表格提交 |
|---|---|---|
| 123 | {"firstname":{"value":"FAKE"},"lastmodifieddate":{"value":"FAKE"},"lastname":{"value":"FAKE"}} | [{"contact-associated-by":["FAKE"],"conversion-id":"FAKE","form-id":"FAKE","form-type":"FAKE","meta-data ":[],"portal-id": FAKE,"timestamp": FAKE,"title":"FAKE"}] |
uj5u.com熱心網友回復:
您可以使用pd.json_normalize哪個應該更簡單。
>>> df
ID PROPERTIES FORMSUBMISSIONS
0 123 {'firstname': {'value': 'FAKE'}, 'lastmodified... [{'contact-associated-by': ['FAKE'], 'conversi...
>>> df = df.explode('FORMSUBMISSIONS') # list to dict
>>> df
ID PROPERTIES FORMSUBMISSIONS
0 123 {'firstname': {'value': 'FAKE'}, 'lastmodified... {'contact-associated-by': ['FAKE'], 'conversio...
現在您可以json_normalize對 FORMSUBMISSIONS 列進行操作了。為了保留其他列,我使用pd.concat
>>> df = pd.concat([df, pd.json_normalize(df['FORMSUBMISSIONS']), axis=1).drop('FORMSUBMISSIONS', axis=1)
>>> df
ID PROPERTIES contact-associated-by conversion-id form-id form-type meta-data portal-id timestamp title
0 123 {'firstname': {'value': 'FAKE'}, 'lastmodified... [FAKE] FAKE FAKE FAKE [] FAKE FAKE FAKE
您可以在 PROPERTIES 列上執行相同的操作。
df = pd.concat([df, pd.json_normalize(df.PROPERTIES)], axis=1).drop('PROPERTIES', axis=1)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/409872.html
標籤:
上一篇:將串列拆分為列Pandas
