我有一个 JSON 列表,我使用以下代码对其进行了规范化:
json_nor = pd.json_normalize(data, max_level=1)
pd.set_option('display.max_colwidth', None)
#view json_nor
json_nor
然后我使用以下代码清理了这些数据:
df = json_nor.explode('APIResponse.data').reset_index(drop=True)
# Normalize the 'APIResponse.data' column into a DataFrame
data_df = pd.json_normalize(df['APIResponse.data'])
# Drop the 'APIResponse.data' column from the original DataFrame
df = df.drop('APIResponse.data', axis=1)
# Concatenate the original DataFrame and the normalized DataFrame along the columns axis
df = pd.concat([df, data_df], axis=1)
#show the datafram
df
的输出
更改此设置的最佳方法是什么,以便每个地址占一行,并且与该地址关联的每个姓名、电话和电子邮件都有一个单独的列?
我正在考虑使用 pandas .split() 方法,但不可能知道每个地址的最终输出有多少列,因为每个地址都有不同数量的与其关联的姓名、电话和电子邮件。我也在考虑使用正则表达式,但找不到正确的方法。
两个步骤:
1- 首先您需要将它们展开为列。
2-然后使用melt将数据帧从宽转换为长。
# Use apply with pd.Series to expand the 'values' column into separate columns
values_expanded = df['emails'].apply(pd.Series)
# Combine the expanded columns back to the original DataFrame
result = df.drop(columns=['emails']).join(values_expanded)
# Use melt to convert wide DataFrame into long format
df_long = pd.melt(result, id_vars=['name'])