在数据分析领域,处理和分析嵌套JSON数据是一项常见且重要的任务。本文将详细介绍六种不同的方法,用于将嵌套JSON字符串转换为结构化的Pandas DataFrame,并进行比较分析。我们将从数据初始化开始,逐步介绍每种方法的实现过程、结果展示、方法解析、优缺点以及参考文献。
数据初始化与预览
首先,我们创建一个包含订单编号和报告数据的DataFrame。报告数据是JSON编码的字符串列表,每个字符串代表一个字典,字典中包含车辆交易价格的属性和变化范围。
import pandas as pd
# 示例数据
df = pd.DataFrame({
'order_no': [1, 2],
'repot': [
'[{"车商收车价": "1.95->2.03"}, {"车商批发价": "1.99->2.07"}]',
'[{"车商零售价": "2.40->2.48"}, {"个人间交易价": "2.21->2.29"}]'
]
})
print("初始化数据预览:")
print(df)
原始数据
order_no | repot |
---|---|
1 | [{“车商收车价”: “1.95->2.03”}, {“车商批发价”: “1.99->2.07”}] |
2 | [{“车商零售价”: “2.40->2.48”}, {“个人间交易价”: “2.21->2.29”}] |
期望结果
order_no | 车商收车价 | 车商批发价 | 车商零售价 | 个人间交易价 |
---|---|---|---|---|
1 | 1.95->2.03 | 1.99->2.07 | ||
2 | 2.40->2.48 | 2.21->2.29 |
方法1:使用json_normalize
和explode
实现过程
import ast
# 解析JSON字符串并展开
df['repot'] = df['repot'].apply(ast.literal_eval)
normalized = pd.json_normalize(df['repot'].explode())
df_expanded_method1 = pd.concat([df.drop('repot', axis=1), normalized], axis=1)
结果展示
print("方法1结果:")
print(df_expanded_method1)
方法2:使用apply
和pd.Series
实现过程
df['repot'] = df['repot'].apply(ast.literal_eval)
df_expanded_method2 = df.explode('repot')
df_expanded_method2 = df_expanded_method2.apply(lambda row: pd.Series({**{'order_no': row['order_no']}, **row['repot']}), axis=1).reset_index(drop=True)
结果展示
print("方法2结果:")
print(df_expanded_method2)
方法3:使用itertuples
和循环
实现过程
expanded_data_method3 = []
for row in df.itertuples(index=False):
for item in ast.literal_eval(row.repot):
expanded_data_method3.append({**{'order_no': row.order_no}, **item})
df_expanded_method3 = pd.DataFrame(expanded_data_method3)
结果展示
print("方法3结果:")
print(df_expanded_method3)
方法4:使用concat
和列表推导式
实现过程
rows_method4 = []
for index, row in df.iterrows():
for item in ast.literal_eval(row.repot):
rows_method4.append({**{'order_no': row['order_no']}, **item})
df_expanded_method4 = pd.DataFrame(rows_method4)
结果展示
print("方法4结果:")
print(df_expanded_method4)
方法5:使用apply
和字典展开
实现过程
df['repot'] = df['repot'].apply(ast.literal_eval)
expanded_data_method5 = []
for index, row in df.iterrows():
for item in row['repot']:
new_row = {'order_no': row['order_no'], **item}
expanded_data_method5.append(new_row)
df_expanded_method5 = pd.DataFrame(expanded_data_method5)
结果展示
print("方法5结果:")
print(df_expanded_method5)
方法6:使用concat
和独立的DataFrame
实现过程
df['repot'] = df['repot'].apply(ast.literal_eval)
results_method6 = []
for index, row in df.iterrows():
for item in row['repot']:
temp_df = pd.DataFrame([item], index=[index])
temp_df['order_no'] = row['order_no']
results_method6.append(temp_df)
df_expanded_method6 = pd.concat(results_method6, ignore_index=True)
结果展示
print("方法6结果:")
print(df_expanded_method6)
优缺点比较
方法1:json_normalize
和explode
- 优点:代码简洁,易于理解和维护;性能较好,特别是在处理大型数据集时。
- 缺点:需要确保数据格式正确,否则可能会抛出异常。
方法2:apply
和pd.Series
- 优点:灵活,可以处理更复杂的数据结构。
- 缺点:性能可能不如方法1,特别是在数据集较大时。
方法3:itertuples
和循环
- 优点:适用于较小的数据集,易于调试和理解。
- 缺点:性能较差,特别是在处理大型数据集时。
方法4:concat
和列表推导式
- 优点:代码简洁,易于理解。
- 缺点:可能不如方法1和方法2灵活。
方法5:apply
和字典展开
- 优点:灵活,可以处理更复杂的数据结构。
- 缺点:性能可能不如方法1,特别是在数据集较大时。
方法6:concat
和独立的DataFrame
- 优点:适用于需要对每个字典项
进行单独处理的场景。 - 缺点:代码复杂度较高,性能可能不如方法1。
参考文献
- Pandas官方文档:Pandas Documentation
- JSON解析与处理:JSON.org
- Python官方文档:Python Documentation
- Stack Overflow:Stack Overflow
- W3Schools在线教程:W3Schools
通过本文的详细介绍和比较,您可以根据自己的需求和数据特点选择合适的方法来处理和分析嵌套JSON数据。希望这些方法能够帮助您更有效地进行数据分析工作。如果您有任何问题或需要进一步的帮助,请随时联系我们。