熊猫:将列表列表转换为多列

时间:2017-07-14 16:16:36

标签: python list pandas dataframe iteration

我是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]])具有相同的长度(并且始终是)但是列表中的整数(12)可以是任何数字。

我想将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)包含列表中的第一个数字(因此,在这种情况下,我们有一个整数12)。
  • 第二列(1)将第一个ID号作为列标题,并包含每个列表的第二个值(20.120.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笔记本中,我得到以下结果(当我在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?我有一种感觉,我需要重塑我的数据框架,但我不知道该怎么做。

任何建议和建议都将不胜感激.. !!

1 个答案:

答案 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存在一个更简单,更优雅的解决方案。