You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Pandas的json_normalize与pd.concat合并后出现NaN行的问题

Pandas拆分合并DataFrame消除NaN值问题解决

问题场景

尝试用json_normalize和pd.concat拆分嵌套JSON并合并DataFrame,原始代码如下:

import pandas as pd

df = pd.DataFrame({
    'ROW1': ['TC', 'OD', 'GN', 'OLT'],
    'D2': [1680880134, 4, 0, [{'ID': '5771841270', 'SLX': [{'T1': '1', 'T2': '1729494797'},
                                                           {'T1': '1', 'T2': '1729445'}]}]]
})

df_transposed = df.set_index('ROW1').transpose()
df_flattened = pd.json_normalize(df_transposed['OLT'][0], 'SLX', ['ID'])
final_df = pd.concat([df_transposed.drop('OLT', axis=1), df_flattened], axis=1)

print(final_df)

当前错误结果

执行后出现大量NaN,输出如下:

TC   OD   GN   T1          T2          ID
D2  1680880134    4    0  NaN         NaN         NaN
0          NaN  NaN  NaN    1  1729494797  5771841270
1          NaN  NaN  NaN    1     1729445  5771841270

期望输出

希望TC、OD、GN的数值能与展开的SLX数据逐行对应:

TC   OD   GN T1          T2          ID
D2  1680880134    4    0  1  1729494797  5771841270
D2  1680880134    4    0  1     1729445  5771841270

解决方案

问题根源是df_transposed只有1行,而df_flattened有2行,直接concat会因行索引不匹配产生NaN。修正思路是先提取TC/OD/GN的数值,将其重复对应SLX的行数后,再与展开的数据合并:

import pandas as pd

df = pd.DataFrame({
    'ROW1': ['TC', 'OD', 'GN', 'OLT'],
    'D2': [1680880134, 4, 0, [{'ID': '5771841270', 'SLX': [{'T1': '1', 'T2': '1729494797'},
                                                           {'T1': '1', 'T2': '1729445'}]}]]
})

# 提取TC、OD、GN的数值
fixed_cols = df[df['ROW1'].isin(['TC', 'OD', 'GN'])].set_index('ROW1').T
# 展开SLX数据
flattened = pd.json_normalize(df[df['ROW1'] == 'OLT']['D2'].iloc[0], 'SLX', ['ID'])
# 将fixed_cols重复对应flattened的行数,然后合并
final_df = pd.concat([fixed_cols.loc[fixed_cols.index.repeat(len(flattened))].reset_index(drop=True), 
                      flattened], axis=1)
# 恢复原索引名称
final_df.index = ['D2'] * len(final_df)

print(final_df)

代码解释

  1. 提取固定列:筛选出TC、OD、GN行并转置,得到仅包含这三个值的单行DataFrame。
  2. 重复固定行:使用repeat方法将单行数据重复flattened的行数(即SLX数组的元素个数),保证行数匹配。
  3. 合并数据:将重复后的固定列与展开的SLX数据进行横向合并,最后重置索引为原格式。

内容的提问来源于stack exchange,提问作者snn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 17:53:23