[英]How to split a tuple and save it to a dataframe
我有一个这样的元组列表:
a=[('A7855', 'item1', 'item2'),('A7856', 'item3', 'item4', 'item5')]
我想将该列表保存到数据框,如下所示:
No ID itemNum
1 A7855 item1
2 item2
3 A7856 item3
4 item4
5 item5
我该如何解决这个问题?
你也可以在这里使用melt
::
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)
No ID itemNum
0 1 A7855 item1
1 2 item2
2 3 A7856 item3
3 4 item4
4 5 item5
将列表理解与DataFrame
化一起使用,并循环所有值,而无需首先获取元组列表,然后将其传递给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
我建议您使用多个变量分配。 在第一个元组之后的所有元组变量都将进入“ 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.