如何更简洁地将列表与DataFrame合并并展开多值单元格为列?
问题:如何更简洁地将列表与DataFrame合并成指定格式?
输入数据
import pandas as pd table = pd.DataFrame({'a':[0,0,0,0],'b':[1,1,1,3,],'c':[2,2,5,4],'d':[3,6,6,6]},dtype='float64') id_list = [[55,66], [77]]
table 的初始输出:
a b c d 0 0.0 1.0 2.0 3.0 1 0.0 1.0 2.0 6.0 2 0.0 1.0 5.0 6.0 3 0.0 3.0 4.0 6.0
预期输出
希望合并后得到:
a b c d ID_0 ID_1 0 0.0 1.0 2.0 3.0 55.0 66.0 1 0.0 1.0 2.0 6.0 77.0 NaN 2 0.0 1.0 5.0 6.0 NaN NaN 3 0.0 3.0 4.0 6.0 NaN NaN
现有实现方法
目前的实现分为三步:
Step 1:将列表转为Series并合并
x = pd.Series(id_list, name ="ID") new = pd.concat([table, x], axis=1)
输出:
a b c d ID 0 0.0 1.0 2.0 3.0 [55, 66] 1 0.0 1.0 2.0 6.0 [77] 2 0.0 1.0 5.0 6.0 NaN 3 0.0 3.0 4.0 6.0 NaN
Step 2:拆分ID列并重命名
ID = new['ID'].apply(pd.Series) ID = ID.rename(columns = lambda x : 'ID_' + str(x)) new_x = pd.concat([new[:], ID[:]], axis=1)
输出:
a b c d ID ID_0 ID_1 0 0.0 1.0 2.0 3.0 [55, 66] 55.0 66.0 1 0.0 1.0 2.0 6.0 [77] 77.0 NaN 2 0.0 1.0 5.0 6.0 NaN NaN NaN 3 0.0 3.0 4.0 6.0 NaN NaN NaN
Step 3:删除原ID列
new_x = new_x.drop(columns=['ID'], axis = 1)
简洁实现方案
可以直接将列表转为带指定列名的DataFrame,再与原表合并,两步即可完成:
# 将列表转为DataFrame,自动补全缺失值,并重命名列 id_df = pd.DataFrame(id_list).rename(columns=lambda x: f'ID_{x}') # 按列合并两个DataFrame,自动对齐索引补全NaN result = pd.concat([table, id_df], axis=1)
甚至可以写成一行紧凑代码:
result = pd.concat([table, pd.DataFrame(id_list).rename(columns=lambda x: f'ID_{x}')], axis=1)
执行后直接得到预期输出:
a b c d ID_0 ID_1 0 0.0 1.0 2.0 3.0 55.0 66.0 1 0.0 1.0 2.0 6.0 77.0 NaN 2 0.0 1.0 5.0 6.0 NaN NaN 3 0.0 3.0 4.0 6.0 NaN NaN
原理说明
pd.DataFrame(id_list)会自动处理不等长的列表,短列表对应的行自动填充NaN补全长度rename(columns=lambda x: f'ID_{x}')直接将默认的数字列名改为ID_0、ID_1的格式pd.concat([table, ...], axis=1)按列合并时,会自动对齐两个DataFrame的索引,原表中超出列表长度的行也会自动填充NaN
内容的提问来源于stack exchange,提问作者Ahmed Nabil
相关产品推荐
相关产品推荐

