为了账号安全,请及时绑定邮箱和手机立即绑定

将数据框列表转换为具有自定义键的字典列表

将数据框列表转换为具有自定义键的字典列表

子衿沉夜 2022-12-20 11:23:17
输入数据框列表。每个数据帧可以有不同的长度,总列数也可以不同。每个数据框都有一个名为“special”的列。除此特殊列外,其他列名称在该列表中将是唯一的。df_1 = pd.DataFrame({"column1":["1","2","3"], "column2":["4","5","6"], "special":["1000","2000","3000"]})df_2 = pd.DataFrame({"column3": ["1","2","3","4"], "column4": ["8","9","10","11"], "column5":["12","13","14","15"],"special":["1000","2000","3000","4000"]})df_list = [df_1,df_2]输出字典列表,其中每个字典都有 3 个固定键:name、value和special。这是 df_list 仅包含 df_1 时的预期输出。提到这一点是为了简化:[{'name': 'column1', 'value': '1', 'special': '1000'}, {'name': 'column1', 'value': '2', 'special': '2000'}, {'name': 'column1', 'value': '3', 'special': '3000'}, {'name': 'column2', 'value': '4', 'special': '1000'}, {'name': 'column2', 'value': '5', 'special': '2000'}, {'name': 'column2', 'value': '6', 'special': '3000'}]当前代码我已经能够使用数据框上的 apply() 方法来做到这一点,但我怀疑可能会有更好的方法。这是我现在的做法:for data_frame in df_list:    for column in data_frame:        if column != "special":            result.extend(data_frame.apply(lambda x:{"name":column,"value":x[column],"special":x["special"]},axis=1).to_list())你能建议任何优化或不同的方法吗?我还考虑过连接所有数据帧并仅运行内部循环,但由于它们的长度不尽相同,因此会有很多 NaN 值。那会是处理这个问题的更好方法吗?
查看完整描述

2 回答

?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

IIUc,你可以试试concatmelt

print(pd.concat(df_list,sort=False).melt('special',var_name='name')
     .dropna(subset=['value'])[['name','value','special']].to_dict('records'))

[{'name': 'column1', 'value': '1', 'special': '1000'}, {'name': 'column1', 'value': '2', 'special': '2000'}, {'name': 'column1', 'value': '3', 'special': '3000'}, {'name': 'column2', 'value': '4', 'special': '1000'}, {'name': 'column2', 'value': '5', 'special': '2000'}, {'name': 'column2', 'value': '6', 'special': '3000'}, {'name': 'column3', 'value': '1', 'special': '1000'}, {'name': 'column3', 'value': '2', 'special': '2000'}, {'name': 'column3', 'value': '3', 'special': '3000'}, {'name': 'column3', 'value': '4', 'special': '4000'}, {'name': 'column4', 'value': '8', 'special': '1000'}, {'name': 'column4', 'value': '9', 'special': '2000'}, {'name': 'column4', 'value': '10', 'special': '3000'}, {'name': 'column4', 'value': '11', 'special': '4000'}, {'name': 'column5', 'value': '12', 'special': '1000'}, {'name': 'column5', 'value': '13', 'special': '2000'}, {'name': 'column5', 'value': '14', 'special': '3000'}, {'name': 'column5', 'value': '15', 'special': '4000'}]


查看完整回答
反对 回复 2022-12-20
?
莫回无

TA贡献1865条经验 获得超7个赞

# Create an empty list

melted_df = []


# Melt all the dfs in your list into a dataframe

for dataframe in df_list:

    temp = dataframe.melt(var_name="name", 

        id_vars=["special"], 

        value_name="value")


# Append the melted dfs into your list

melted_df.append(temp)


# Concatenate the dfs in the list

result = pd.concat(melted_df)


# Convert the df into dictionary

result.to_dict(orient='records')

输出:


[{'special': '1000', 'name': 'column1', 'value': '1'},

 {'special': '2000', 'name': 'column1', 'value': '2'},

 {'special': '3000', 'name': 'column1', 'value': '3'},

 {'special': '1000', 'name': 'column2', 'value': '4'},

 {'special': '2000', 'name': 'column2', 'value': '5'},

 {'special': '3000', 'name': 'column2', 'value': '6'},

 {'special': '1000', 'name': 'column3', 'value': '1'},

 {'special': '2000', 'name': 'column3', 'value': '2'},

 {'special': '3000', 'name': 'column3', 'value': '3'},

 {'special': '4000', 'name': 'column3', 'value': '4'},

 {'special': '1000', 'name': 'column4', 'value': '8'},

 {'special': '2000', 'name': 'column4', 'value': '9'},

 {'special': '3000', 'name': 'column4', 'value': '10'},

 {'special': '4000', 'name': 'column4', 'value': '11'},

 {'special': '1000', 'name': 'column5', 'value': '12'},

 {'special': '2000', 'name': 'column5', 'value': '13'},

 {'special': '3000', 'name': 'column5', 'value': '14'},

 {'special': '4000', 'name': 'column5', 'value': '15'}]



查看完整回答
反对 回复 2022-12-20
  • 2 回答
  • 0 关注
  • 99 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信