将字典中的嵌套列表转换为数据框

3

我正在尝试将一个包含嵌套列表的字典转换为数据框。我得到的数据框输出如下:

import pandas as pd
data = {'a': 'test', 'b': 1657, 'c': 'asset', 'd': [['2089', '0.0'], ['2088', '0.0']], 'e': [['2088', '0.0'], ['2088', '0.0'], ['2088', '0.00']]}
df = pd.DataFrame({ key:pd.Series(value) for key, value in data.items() })

我的输出是

      a       b      c            d             e
0  test  1657.0  asset  [2089, 0.0]   [2088, 0.0]
1   NaN     NaN    NaN  [2088, 0.0]   [2088, 0.0]
2   NaN     NaN    NaN          NaN  [2088, 0.00]

所需输出为
      a       b      c     d1    d2     e1   e2
0  test  1657.0  asset   2089   0.0   2088  0.0
1   NaN     NaN    NaN   2088   0.0   2088  0.0
2   NaN     NaN    NaN   NaN    NaN   2088  0.0

感谢您的努力。

3个回答

2

在消除d列中的NaN后,请尝试以下操作:

df = df.dropna(subset='d')
df[['d1', 'd2']] = pd.DataFrame(df.d.tolist(), columns=['d1', 'd2'])
df[['e1', 'e2']] = pd.DataFrame(df.e.tolist(), columns=['e1', 'e2'])
df= df.drop(columns=['d', 'e'])

df
>a  b   c   d1  d2  e1  e2
0   test    1657.0  asset   2089    0.0 2088    0.0
1   NaN NaN NaN 2088    0.0 2088    0.0

1

我从不喜欢硬编码某些列名,并且总是倾向于找到一种程序化的方式来解决这些问题。

import pandas as pd

data = {'a': 'test', 
        'b': 1657, 
        'c': 'asset', 
        'd': [['2089', '0.0'], ['2088', '0.0']],
        'e': [['2088', '0.0'], ['2088', '0.0'], ['2088', '0.00']],
        'f': [['2088', '0.0', "x", "foo"], ['2088', '0.0', 'bar', "i"], ['2088', '0.00', "z", "0.2"]], 
        "x": ["test1", "test2"]}

s = []
for key, value in data.items():
    if isinstance(value, list):
        if isinstance(value[0], list):
            cols = [key+str(i)for i in range(1, len(value[0]) + 1, 1)]
            s.append(pd.DataFrame(data=value, columns=cols))
        else:
            s.append(pd.Series(data=value, name=key))
    else:
        s.append(pd.Series(data=value, name=key))
df = pd.concat(s, axis=1)

因此,它循环遍历字典并查看字典值是否为列表。
如果是一个列表,它将检查它是否是嵌套列表。如果它是一个嵌套列表,它将查看第一个元素的长度并构造数据帧的列名(例如e1,e2),并将该键值对的数据帧存储在列表中。如果不是嵌套列表,它将生成键值对的系列并将其存储在同一列表中。
如果不是列表,则生成键值对的系列并将其存储在同一列表中。 最后一步只是连接列表。
我已经添加了一个新的键值对来说明当您扩展字典时一切都将正常工作。
      a       b      c    d1   d2    e1    e2    f1    f2   f3   f4      x
0  test  1657.0  asset  2089  0.0  2088   0.0  2088   0.0    x  foo  test1
1   NaN     NaN    NaN  2088  0.0  2088   0.0  2088   0.0  bar    i  test2
2   NaN     NaN    NaN   NaN  NaN  2088  0.00  2088  0.00    z  0.2    NaN

考虑到后面,你也可以使用递归函数来实现,但这会牺牲可读性。 - Sam

0

这段代码给了我想要的数据框:

import pandas as pd
import numpy as np

#import pandas as pd
data = {'a': 'test', 'b': 1657, 'c': 'asset', 'd': 
[['2089', '0.0'], ['2088', '0.0']], 'e': [['2088', '0.0'], 
['2088', '0.0'], ['2088', '0.00']]}
df = pd.DataFrame({ key:pd.Series(value) for key, value in 
data.items() })
a = ['test']
b = [1657]
c = ['asset']
d = [['2089', '0.0'], ['2088', '0.0']]
e = [['2088', '0.0'], ['2088', '0.0'], ['2088', '0.00']]

d1 = [d[i][0] for i in range(len(d))]
d2 = [d[i][1] for i in range(len(d))]

e1 = [e[i][0] for i in range(len(e))]
e2 = [e[i][1] for i in range(len(e))]

df = pd.DataFrame({'a':pd.Series(a),'b':pd.Series(b),'c':pd.Series(c),'d1':pd.Series(d1),'d2':pd.Series(d2),'e1':pd.Series(e1),'e2':pd.Series(e2)})

这似乎不是计算数据框@logame的最佳方式。非常感谢您的努力。谢谢。 - Berlin Benilo

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