我是python和pandas的新手,我想将列表列表(包含我从一堆文件中提取的信息)转换为单个列。我已经检查了很多关于stackoverflow的帖子,到目前为止还没有发现任何对我有用的东西。但是,如果您遇到类似的内容,请在评论中发布链接。
我有一个像这样的数据帧(一个代表性的例子):
df:
ID Values_a
0 1 [[1,20.1],[2,20.2]]
1 7 [[1,30.1],[2,30.2]]
两个列表([[1,20.1],[2,20.2]]
和[[1,30.1],[2,30.2]]
)具有相同的长度(并且始终是)但是列表中的整数(1
和2
)可以是任何数字。
我想将df
转换为这样的数据框:
Label 1(Number of the 1st ID) 7(Number of the 2nd ID)
1 20.1 30.1
2 20.2 30.2
哪里有三列:
Label
)包含列表中的第一个数字(因此,在这种情况下,我们有一个整数1
和2
)。1
)将第一个ID号作为列标题,并包含每个列表的第二个值(20.1
,20.2
)。首先,我使用apply。(pd.Series)来分割列表列表以获得类似这样的内容(我称之为df2):
df2:
ID 0 1
0 1 [1,20.1] [2,20.2]
1 7 [1,30.1] [2,30.2]
但是,我可以使用相同的技巧(apply。(pd.Series))再次拆分列以获得类似的内容:
ID 0 1 2 3
0 1 1 20.1 2 20.2
1 7 1 30.1 2 30.2
然后,弄清楚如何从这里到达我想要的地方。
我写过类似的内容再次拆分列表:
names = [x for x in df2.colmuns]
for name in names:
df3 = df2[name].apply(pd.Series)
print df3
在jupyter笔记本中,我得到以下结果(当我在print df3
循环中包含for
以检查输出时):
0 1
0 1.0 20.1
1 2.0 20.2
0 1
0 1.0 30.1
1 2.0 30.2
如果我在for循环中执行df3.info()
,它会告诉我df3中有两个数据帧。 (这是正常的吗?)
如果我致电df3
,这就是我得到的:
0 1
0 1.0 30.1
1 2.0 30.2
我似乎覆盖df3
而不是将新数据附加到df3
。
所以:
如何解决这个问题? (也许创建一个新的数据帧并将拆分列附加到新的数据帧?)
如何将df3转换为我想要的DataFrame?我有一种感觉,我需要重塑我的数据框架,但我不知道该怎么做。
任何建议和建议都将不胜感激.. !!
答案 0 :(得分:2)
根据Values_a
列中的数据结构,这里有一个可行的解决方法
>> x = pd.DataFrame({'ID': [1, 7],
>> 'Values_a': [ [[1, 20.1], [2, 20.2]],
>> [[1, 30.1], [2, 30.2]] ] });
>> data = { ID: [v[1] for v in x.loc[x['ID'] == ID, 'Values_a'].values[0]]
>> for ID in x['ID'] }
>> index = [v[0] for v in x['Values_a'].iloc[0]]
>> y = pd.DataFrame(data, index=index)
1 7
1 20.1 30.1
2 20.2 30.2
尽管如此,我认为groupby
存在一个更简单,更优雅的解决方案。