python - 在python中将一列取消嵌套到多列中
问题描述
我正在使用以下函数来取消嵌套列:
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
df1 = flatten_nested_json_df(df)
df = 数据是[{'id': 123, 'admin_graphql_api_id': 'abc123', 'created_at': '2021-08-20T18:14:38+05:30', 'location_id': 564, 'name': 123.1, 'order_id': 231, 'receipt': {}, 'service': 'manual', 'shipment_status': None, 'status': 'success', 'tracking_company': 'SHIPROCKET', 'tracking_number': 434}]
无法取消嵌套此列
解决方案
推荐阅读
- python - Keras - 一类 CNN - 每一步都有两个输入
- python - 进入第一个纪元后,Tensorflow 抛出 ValueError()
- typescript - 通用映射以及将值与键关联
- javascript - Map 以及如何在 JS 中访问对象键?
- javascript - 正则表达式 JS
- reactjs - 编译错误 Unexpected token '<' my first app React
- python - Django 测试 - ImportError/ModuleNotFoundError
- python - MySQL auto_increment 不为空
- macos - gfortran 编译器给出分段错误
- php - AJAX 加载到另一个具有变量的 div