如何将Pandas DataFrame的整行id转为列标题?附代码修改需求
问题:将DataFrame的行转为列标题
我写了一段处理JSON数据并生成DataFrame的代码:
class Decoder(json.JSONDecoder): def decode(self, s): result = super(Decoder, self).decode(s) return self._decode(result) def _decode(self, o): if isinstance(o, str): try: return int(o) except ValueError: try: return float(o) except ValueError: return o elif isinstance(o, dict): return {k: self._decode(v) for k, v in o.items()} elif isinstance(o, list): return [self._decode(v) for v in o] else: return o with open('ouput_data.json') as f: data=json.load(f,cls=Decoder) #print(data) list=[] list=(data['data']) df = pd.DataFrame(list,columns=['id','value']) support_df = pd.DataFrame({'id':range(1,10),'value_aux':''}) final_df = support_df.merge(df,how='left') final_df['value'] = np.where(final_df['value'].isna(),final_df['value_aux'],final_df['value']) #print(final_df) final_df = final_df.drop(columns='value_aux') #final_df=final_df.drop(['id'],axis=1) final_df=final_df.T print(final_df)
当前final_df的输出如下:
0 1 2 3 4 5 6 7 8 id 1 2 3 4 5 6 7 8 9 value NY 11 D 531293696 5202013
可见id为单独一行,value为单独一行。我需要将整行id转为DataFrame的列标题,请问该如何修改代码?若能直接给出修改后的代码将十分感谢。
解决方案
你只需要在转置后把id行的值设为列名,再删除原id行即可。另外注意不要用list作为变量名(会覆盖Python内置类型),我也帮你调整了这个小问题。修改后的完整代码如下:
import json import pandas as pd import numpy as np class Decoder(json.JSONDecoder): def decode(self, s): result = super(Decoder, self).decode(s) return self._decode(result) def _decode(self, o): if isinstance(o, str): try: return int(o) except ValueError: try: return float(o) except ValueError: return o elif isinstance(o, dict): return {k: self._decode(v) for k, v in o.items()} elif isinstance(o, list): return [self._decode(v) for v in o] else: return o with open('ouput_data.json') as f: data=json.load(f,cls=Decoder) # 替换list变量名,避免覆盖内置类型 data_list = data['data'] df = pd.DataFrame(data_list,columns=['id','value']) support_df = pd.DataFrame({'id':range(1,10),'value_aux':''}) final_df = support_df.merge(df,how='left') final_df['value'] = np.where(final_df['value'].isna(),final_df['value_aux'],final_df['value']) final_df = final_df.drop(columns='value_aux') final_df = final_df.T # 核心修改:将id行设为列标题,然后删除原id行 final_df.columns = final_df.iloc[0] final_df = final_df.drop('id') print(final_df)
关键修改点说明:
- 设置列标题:
final_df.columns = final_df.iloc[0]这行代码把转置后的第一行(也就是原来的id行数值)赋值给DataFrame的列名。 - 删除原id行:
final_df = final_df.drop('id')移除不再需要的id行,只保留value行数据。 - 变量名优化:把
list改为data_list,避免和Python内置的list类型冲突,减少潜在bug。
修改后你会得到这样的输出:
id 1 2 3 4 5 6 7 8 9 value NY 11 D 531293696 5202013
内容的提问来源于stack exchange,提问作者user11646543
相关产品推荐
相关产品推荐

