【问题标题】:Pandas: Convert list of lists to multiple columnsPandas:将列表列表转换为多列
【发布时间】: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]])具有相同的长度(并且永远是),但是列表中的整数(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 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


【解决方案1】:

根据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 存在更简单优雅的解决方案。

【讨论】:

  • 哦,这很聪明...我没想过使用列表/字典理解...!!非常感谢,这与实际的 df 配合得很好 :)
猜你喜欢
  • 2020-03-24
  • 1970-01-01
  • 2022-01-24
  • 2021-06-22
  • 2021-03-01
  • 2021-03-22
  • 2013-11-04
  • 2013-02-13
  • 2023-04-03
相关资源
最近更新 更多