我有一个看起来像这样的 pandas DataFrame(创建它的代码在问题的底部): col_1 col_2 foo_1 foo_2 col_3 col_4 col_3 col_40 1 4 2 8 5 71 3 1 6 3 8 9我想将foo_1和foo_2列“由内而外”,即我的预期输出是: col_1 col_2 col_3 col_40 1 4 {'foo_1': 2, 'foo_2': 5} {'foo_1': 8, 'foo_2': 7}1 3 1 {'foo_1': 6, 'foo_2': 8} {'foo_1': 3, 'foo_2': 9}是否有一种有效的方法(即不涉及编写逐行遍历每一行的 python 循环)在 pandas 中执行此操作?生成起始 DataFrame 的代码:import pandas as pdcols = pd.MultiIndex.from_tuples( [ ("col_1", ""), ("col_2", ""), ("foo_1", "col_3"), ("foo_1", "col_4"), ("foo_2", "col_3"), ("foo_2", "col_4"), ])df = pd.DataFrame([[1, 4, 2, 8, 5, 7], [3, 1, 6, 3, 8, 9]], columns=cols)生成预期输出的代码:pd.DataFrame( [ { "col_1": 1, "col_2": 4, "col_3": {"foo_1": 2, "foo_2": 5}, "col_4": {"foo_1": 8, "foo_2": 7}, }, { "col_1": 3, "col_2": 1, "col_3": {"foo_1": 6, "foo_2": 8}, "col_4": {"foo_1": 3, "foo_2": 9}, }, ])
1 回答
qq_遁去的一_1
TA贡献1725条经验 获得超7个赞
使用DataFrame.filter
+并使用DataFrame.droplevel
聚合列,最后使用删除列:axis=1
dict
DataFrame.drop
MultiLevel
df['col_3'] = df.filter(like='col_3').droplevel(1, 1).agg(dict, axis=1)
df['col_4'] = df.filter(like='col_4').droplevel(1, 1).agg(dict, axis=1)
df = df.drop(['foo_1', 'foo_2'], 1).droplevel(1, 1)
结果:
# print(df)
col_1 col_2 col_3 col_4
0 1 4 {'foo_1': 2, 'foo_2': 5} {'foo_1': 8, 'foo_2': 7}
1 3 1 {'foo_1': 6, 'foo_2': 8} {'foo_1': 3, 'foo_2': 9}
添加回答
举报
0/150
提交
取消