【发布时间】:2017-12-19 19:46:15
【问题描述】:
我是 python 和 pandas 的新手,我想将列表列表(包含我从一堆文件中提取的信息)转换为单个列。我已经检查了很多关于 stackoverflow 的帖子,到目前为止还没有发现任何对我有用的东西。但是,如果您遇到类似情况,请在 cmets 中发布链接。
我有一个这样的数据框(一个有代表性的例子):
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)。 - 第三列包含与 ID 号 7 相同的信息。
首先,我使用 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 notebook 中,我得到以下结果(当我在 for 循环中包含 print df3 以检查输出时):
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?我有一种感觉,我需要重塑我的数据框,但我不知道该怎么做。
任何意见和建议将不胜感激..!!
【问题讨论】:
-
Value_a值是否与一组(在您的情况下为 {1, 2})中的第一个元素(在您的情况下为标签)长度相同? -
@ tarashypka 如果我理解正确,'value_a' 值的长度与我的案例中的第一个元素的长度不同(为了便于查看,我截断了数据框......对不起。 ..) 'ID Values_a' ' 0 1 [[1,20.1],[2,20.2],[3,20.3], blah blah blah]' ' ' 1 7 [[1,30.1],[2,30.2], [3,30.8],等等等等]'
-
@tarashypka 但是在“Value_a”列中,该列中的所有单元格都具有相同的列表长度。
-
[[1,20.1],[2,20.2],[3,20.3], blah blah blah]是否总是与[[1,30.1],[2,30.2],[3,30.8], blah blah blah]具有相同的长度并且总是具有相同的第一个元素(在本例中为 1、2、3)? -
所以: 1. 两个列表的长度总是相同的; 2. 第一个元素可能是 5、7、17。
标签: python list pandas dataframe iteration