使用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)
代码解释
- 提取固定列:筛选出TC、OD、GN行并转置,得到仅包含这三个值的单行DataFrame。
- 重复固定行:使用
repeat方法将单行数据重复flattened的行数(即SLX数组的元素个数),保证行数匹配。 - 合并数据:将重复后的固定列与展开的SLX数据进行横向合并,最后重置索引为原格式。
内容的提问来源于stack exchange,提问作者snn
相关产品推荐
相关产品推荐

