Pandas行转列与列装行
实际上,两种操作的核心代码确实非常相似,因为它们都涉及到将 JSON 数据解析并进行拆分。主要的区别在于操作的顺序和处理的对象:
- 一列转多列:
-
- 首先,我们将 JSON 数据列中的每个 JSON 对象解析为 Python 字典(使用 json.loads())。
- 然后,我们使用 pd.json_normalize() 函数将解析后的字典列表展开为多列,并与原始 DataFrame 进行连接。
- 一行转多行:
-
- 首先,我们使用 explode() 方法将 JSON 数据列中的每个 JSON 数组展开为多行,并重置索引。
- 然后,我们将重置索引后的 DataFrame 中的每行的 JSON 数据解析为 Python 字典(使用 json.loads())。
- 最后,我们再次使用 pd.json_normalize() 函数将解析后的字典列表展开为多列,并与原始 DataFrame 进行连接。
所以,尽管代码实现上看起来非常相似,但是操作的顺序和处理的对象是有区别的。在一列转多列的情况下,我们是将每个 JSON 对象中的键值对转换为多列;而在一行转多行的情况下,我们是将每个 JSON 数组中的元素转换为多行,然后再将每行的 JSON 数据拆分为多列。
行转列
import pandas as pd
import json
from pandas import json_normalize
# 创建示例 DataFrame
data = {
"id": [1, 2, 3],
"json_array_column": [
'[{"name": "Alice", "age": 30, "is_active": true}, {"name": "Bob", "age": 40, "is_active": false}]',
'[{"name": "Charlie", "age": 35, "is_active": true}, {"name": "David", "age": 45, "is_active": false}]',
'[{"name": "Eve", "age": 25, "is_active": true}]'
]
}
df = pd.DataFrame(data)
# 将 JSON 数组列压平为多行
df = df.explode("json_array_column").reset_index(drop=True)
# 使用 json.loads() 解析 JSON 字符串
df["json_array_column"] = df["json_array_column"].apply(json.loads)
# 使用 json_normalize() 函数将 JSON 数据压平为多列
df = pd.concat([df.drop(columns=["json_array_column"]), json_normalize(df["json_array_column"])], axis=1)
# 打印处理后的 DataFrame
df
列转行
import pandas as pd
from pandas import json_normalize
import json
# 创建示例 DataFrame
data = {
"id": [1, 2, 3],
"json_array_column": [
'[{"name": "Alice", "age": 30, "is_active": true}, {"name": "Bob", "age": 40, "is_active": false}]',
'[{"name": "Charlie", "age": 35, "is_active": true}, {"name": "David", "age": 45, "is_active": false}]',
'[{"name": "Eve", "age": 25, "is_active": true}]'
]
}
df = pd.DataFrame(data)
# 使用 apply + json.loads + explode 实现一行变多行
df = df.assign(json_array_column=df['json_array_column'].apply(json.loads)).explode('json_array_column')
# 重置索引
df.reset_index(drop=True, inplace=True)
# 打印处理后的 DataFrame
print(df)
json array数据展开
import pandas as pd
from pandas import json_normalize
import json
# 创建示例 DataFrame
data = {
"id": [1, 2, 3],
"json_array_column": [
'[{"name": "Alice", "age": 30, "is_active": true}, {"name": "Bob", "age": 40, "is_active": false}]',
'[{"name": "Charlie", "age": 35, "is_active": true}, {"name": "David", "age": 45, "is_active": false}]',
'[{"name": "Eve", "age": 25, "is_active": true}]'
]
}
df = pd.DataFrame(data)
# 使用 apply + json.loads + explode 实现一行变多行
df = df.assign(json_array_column=df['json_array_column'].apply(json.loads)).explode('json_array_column').reset_index(drop=True)
# 使用 json_normalize() 函数将 JSON 数据的键值对作为列
df = pd.concat([df.drop(columns=["json_array_column"]), json_normalize(df['json_array_column'])], axis=1)
# 重置索引
df.reset_index(drop=True, inplace=True)
# 打印处理后的 DataFrame
df