如何实现Pandas DataFrame行转列为单行格式?pivot结果异常求解
解决DataFrame pivot后出现NaN的问题
首先,咱们先复现一下你的原始数据和问题场景:
import pandas as pd # 原始DataFrame df = pd.DataFrame({ 'type': ['IP_1', 'IP_2'], 'result': [['a', 'b'], ['c', 'd']] }) # 你尝试的pivot操作 wrong_pivot = df.pivot(columns='type', values='result') print(wrong_pivot) # 输出: # IP_1 IP_2 # 0 NaN ['a', 'b'] # 1 ['c', 'd'] NaN
问题原因
之所以会出现NaN,是因为pivot默认会保留原始DataFrame的行索引作为结果的行索引。你的原始数据有两行(索引0和1),所以pivot后,IP_1只会在它原本所在的行(索引0)有值,IP_2只会在它原本所在的行(索引1)有值,其他位置自然就是NaN了。
解决方案
我们需要让所有type对应的result值都放到同一行里,这里给你几种实用的方法:
方法1:添加临时分组列(最直观)
给所有行添加一个相同的临时列,让pivot把它们归为同一组:
# 添加临时列,所有行值都为0 df['temp'] = 0 # 以temp为索引,type为列,result为值做pivot pivoted_df = df.pivot(index='temp', columns='type', values='result') # 去掉临时索引,得到你想要的格式 pivoted_df = pivoted_df.reset_index(drop=True) print(pivoted_df) # 输出: # IP_1 IP_2 # 0 ['a', 'b'] ['c', 'd']
方法2:用groupby + unstack
通过分组聚合把每个type对应的result提取出来,再转成列:
# 按type分组,取每个组的第一个result值(这里每个type只有一个值) grouped = df.groupby('type')['result'].first() # 把行索引转成列,再转成DataFrame并调整为一行 pivoted_df = grouped.unstack().to_frame().T print(pivoted_df) # 输出和上面一致
方法3:直接构造新DataFrame
如果你的数据量不大,也可以直接遍历原始行来构造目标格式:
pivoted_df = pd.DataFrame({ row['type']: [row['result']] for _, row in df.iterrows() }) print(pivoted_df) # 同样得到你想要的结果
内容的提问来源于stack exchange,提问作者WindCheck
相关产品推荐
相关产品推荐

