我有一个这样的元组列表:
a=[('A7855', 'item1', 'item2'),('A7856', 'item3', 'item4', 'item5')]
,我想将该列表保存到数据框中,如下所示:
No ID itemNum
1 A7855 item1
2 item2
3 A7856 item3
4 item4
5 item5
我该如何解决这个问题?
答案 0 :(得分:2)
您还可以在此处使用melt
:
<option value="femme">Femme</option>
<option value="homme">Homme</option>
df=(pd.DataFrame(a).melt(0,value_name='itemNum').
drop('variable',1).dropna().sort_values(0).rename(columns={0:'ID'}).reset_index(drop=True))
print(df)
要满足您的确切要求,请对 ID itemNum
0 A7855 item1
1 A7855 item2
2 A7856 item3
3 A7856 item4
4 A7856 item5
进行操作:
df
df.loc[df.duplicated('ID'),'ID']=''
df.insert(0,'No',range(1,len(df)+1))
print(df)
答案 1 :(得分:1)
将列表推导与扁平化结合使用,并循环所有值,而无需首先获取元组列表,然后将其传递给DataFrame
构造函数:
b = [(x[0], y) for x in a for y in x[1:]]
df = pd.DataFrame(b, columns=['ID','itemNum'])
print (df)
ID itemNum
0 A7855 item1
1 A7855 item2
2 A7856 item3
3 A7856 item4
4 A7856 item5
如果只需要ID
列的第一个值,则添加if-else
语句,并枚举列表的计数器:
b = [(x[0], y) if i == 0
else ('', y)
for x in a for i, y in enumerate(x[1:])]
df = pd.DataFrame(b, columns=['ID','itemNum'])
print (df)
ID itemNum
0 A7855 item1
1 item2
2 A7856 item3
3 item4
4 item5
如果需要新列No
,请添加DataFrame.insert
,以添加索引值为+ 1的新列:
df.insert(0, 'No', df.index + 1)
print (df)
No ID itemNum
0 1 A7855 item1
1 2 item2
2 3 A7856 item3
3 4 item4
4 5 item5
答案 2 :(得分:1)
我建议您使用多个变量分配。在第一个元组之后的所有元组变量都放入“ itemnum”。
data=[('A7855', 'item1', 'item2'),('A7856', 'item3', 'item4', 'item5')]
rows = []
ids = set()
for idx, *itemnum in data:
for i in itemnum:
if idx in ids:
idx = ''
rows.append((idx, i))
ids.add(idx)
df = pd.DataFrame(rows, columns=['ID','itemNum'])
df.index = [i+1 for i in df.index]
我的输出:
ID itemNum
1 A7855 item1
2 item2
3 A7856 item3
4 item4
5 item5