列表的列表转换为Pandas数据框。

3

我有一个遵循以下格式的数据集:

data =[[[1, 0, 1000], [2, 1000, 2000]],
        [[1, 0, 1500], [2, 1500, 2500], [2, 2500, 4000]]]
var1 = [10.0, 20.0]
var2 = ['ref1','ref2']

我想将其转换为数据框:
dic = {'var1': var1, 'var2': var2, 'data': data}

import Pandas as pd
pd.DataFrame(dic)

结果如下:

结果:

Dataframe initial

然而,我试图得到像这样的东西:

enter image description here

我一直在尝试将字典/列表展开,但没有成功:

pd.DataFrame([[col1, col2] for col1, d in dic.items() for col2 in d])

查看结果:

再试一次

列表的不同大小使得“解包”变得更加复杂。我不确定 pandas 是否能够处理这个问题,或者需要在导入到 pandas 之前处理。

2个回答

2
创建一个合适的列表是有必要的:
new_data = []
for x, v1, v2 in zip(data, var1, var2):
    new_data.extend([y + [v1] + [v2] for y in x])
pd.DataFrame(new_data, columns=['data', 'min', 'max', 'var1', 'var2'])

提供:

   data   min   max  var1  var2
0     1     0  1000    10  ref1
1     2  1000  2000    10  ref1
2     1     0  1500    20  ref2
3     2  1500  2500    20  ref2
4     2  2500  4000    20  ref2

1
你的代码有一个错误(输出结果不匹配)。你重复了 var1 - chrisaycock
1
@chrisaycock 感谢您的指引。我遇到了复制粘贴的问题。在 zip 中应该是 var1var2 而不是两次 var1。我已经修复了这个问题。 - Mike Müller
输出仍然与您在此处粘贴的内容不匹配。提示:检查索引。 - chrisaycock
1
@chrisaycock 我贴上了我的当前输出。 - Mike Müller
1
很好的使用了继承,这在这种情况下非常方便。 - Yoann_R

1
我可以遍历您的临时DataFrame中的行。
df = pd.DataFrame(dic)
result = []
for i,d in df.iterrows():
    temp = pd.DataFrame(d['data'], columns=['data', 'min', 'max'])
    temp['var1'] = d['var1']
    temp['var2'] = d['var2']
    result += [temp]
pd.concat(result)

这个产生:
   data   min   max  var1  var2
0     1     0  1000    10  ref1
1     2  1000  2000    10  ref1
0     1     0  1500    20  ref2
1     2  1500  2500    20  ref2
2     2  2500  4000    20  ref2

问题中所示的期望结果图片显示了索引0, 1, 2, 3, 4。而你所拥有的索引是0, 1, 0, 1, 2 - Mike Müller
1
对于我的使用来说,索引并不是必要的,在我的数据集中,我将传递一个特定的列作为索引。 - Yoann_R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接