Python 熊猫-从目录列表创建df

Python 熊猫-从目录列表创建df,python,pandas,dictionary,Python,Pandas,Dictionary,我有以下格式的数据(目录列表,每个目录包含3个列表): 我希望将上述内容转换为以下df: key List1-1 List1-2 List1-3 List2-1 List2-2 List2-3 List3-1 List3-2 List3-3 40258 2018-07-03T14:13:41 nan

我有以下格式的数据(目录列表,每个目录包含3个列表):

我希望将上述内容转换为以下df:

key    List1-1              List1-2            List1-3               List2-1     List2-2          List2-3                 List3-1         List3-2                   List3-3
40258  2018-07-03T14:13:41  nan                nan                   'Open'      nan              nan                     'Closed'        nan                       nan
40257  2018-07-03T13:47:55 2018-07-03T14:21:52 2018-07-04T11:56:44   'Open'     'In Progress'    'Waiting on 3rd Party'   'In Progress'   'Waiting on 3rd Party'   'In Progress'
40255  2018-07-03T13:12:58  nan                nan                   'Open'      nan              nan                     'Closed'        nan                       nan
40250  nan                  nan                nan                    nan        nan              nan                      nan            nan                       nan
  • 每个键都是一行,列表中的每个元素都是一列
  • 外部列表包含50000个dict,这些dict将被分成行
  • 总有3个内部列表
  • 内部列表的长度是可变的,从0到最多25
我尝试了一个普通的
pd.DataFrame
pd.DataFrame.from_dict
,但我找不到解决方案来处理dict中的多个列表


非常感谢您的帮助。

创建列表列表,然后使用pd创建df。dataFrame(数据、列)似乎是最简单的选择

# First calculate the length of maximum list in the dictionary
# Let that be lmax
data = []
for elem in dict :
    for key in elem :  # Note that only one key is there
        lst = elem[key] # z is the list
        data_curr = [np.nan] * (3*len(lmax) + 1)
        data_curr[0] = elem
        l = len(lst[0])
        for i in range(0,l) :
             data_curr[3*i+1] = z[0][i]
             data_curr[3*i+2] = z[1][i]
             data_curr[3*i+3] = z[2][i]
        data.append(data_curr]

columns = ['key','List1-1,List1-2','List1-3','List2-1','List2-2','List2-3','List3-1','List3-2','List3-3']
df = pd.DataFrame(data,columns=columns)

我希望您能理解创建列表列表然后使用pd创建df的想法。dataFrame(数据、列)似乎是最简单的选择

# First calculate the length of maximum list in the dictionary
# Let that be lmax
data = []
for elem in dict :
    for key in elem :  # Note that only one key is there
        lst = elem[key] # z is the list
        data_curr = [np.nan] * (3*len(lmax) + 1)
        data_curr[0] = elem
        l = len(lst[0])
        for i in range(0,l) :
             data_curr[3*i+1] = z[0][i]
             data_curr[3*i+2] = z[1][i]
             data_curr[3*i+3] = z[2][i]
        data.append(data_curr]

columns = ['key','List1-1,List1-2','List1-3','List2-1','List2-2','List2-3','List3-1','List3-2','List3-3']
df = pd.DataFrame(data,columns=columns)
data=[{40258: [['2018-07-03T14:13:41'], ['Open'], ['Closed']]},
 {40257: [['2018-07-03T13:47:55',
     '2018-07-03T14:21:52',
     '2018-07-04T11:56:44'],
    ['Open', 'In Progress', 'Waiting on 3rd Party'],
    ['In Progress', 'Waiting on 3rd Party', 'In Progress']]},
  {40255: [['2018-07-03T13:12:58'], ['Open'], ['Closed']]},
  {40250: [[], [], []]}]

f = lambda x: x + [np.nan]*(3-len(x))
mod_data = [ [k]+ sum(list(map(f, v)), []) for d in data for k,v in d.items()]

cols = ['key', 'List1-1', 'List1-2', 'List1-3', 'List2-1', 'List2-2', 'List2-3', 'List3-1', 'List3-2', 'List3-3']
df = pd.DataFrame(mod_data, columns=cols).set_index('key')
print(df)
我希望你能明白

data=[{40258: [['2018-07-03T14:13:41'], ['Open'], ['Closed']]},
 {40257: [['2018-07-03T13:47:55',
     '2018-07-03T14:21:52',
     '2018-07-04T11:56:44'],
    ['Open', 'In Progress', 'Waiting on 3rd Party'],
    ['In Progress', 'Waiting on 3rd Party', 'In Progress']]},
  {40255: [['2018-07-03T13:12:58'], ['Open'], ['Closed']]},
  {40250: [[], [], []]}]

f = lambda x: x + [np.nan]*(3-len(x))
mod_data = [ [k]+ sum(list(map(f, v)), []) for d in data for k,v in d.items()]

cols = ['key', 'List1-1', 'List1-2', 'List1-3', 'List2-1', 'List2-2', 'List2-3', 'List3-1', 'List3-2', 'List3-3']
df = pd.DataFrame(mod_data, columns=cols).set_index('key')
print(df)
输出

                   List1-1              List1-2              List1-3 List2-1      List2-2               List2-3      List3-1               List3-2      List3-3
key                                                                                                                                                            
40258  2018-07-03T14:13:41                  NaN                  NaN    Open          NaN                   NaN       Closed                   NaN          NaN
40257  2018-07-03T13:47:55  2018-07-03T14:21:52  2018-07-04T11:56:44    Open  In Progress  Waiting on 3rd Party  In Progress  Waiting on 3rd Party  In Progress
40255  2018-07-03T13:12:58                  NaN                  NaN    Open          NaN                   NaN       Closed                   NaN          NaN
40250                  NaN                  NaN                  NaN     NaN          NaN                   NaN          NaN                   NaN          NaN
输出

                   List1-1              List1-2              List1-3 List2-1      List2-2               List2-3      List3-1               List3-2      List3-3
key                                                                                                                                                            
40258  2018-07-03T14:13:41                  NaN                  NaN    Open          NaN                   NaN       Closed                   NaN          NaN
40257  2018-07-03T13:47:55  2018-07-03T14:21:52  2018-07-04T11:56:44    Open  In Progress  Waiting on 3rd Party  In Progress  Waiting on 3rd Party  In Progress
40255  2018-07-03T13:12:58                  NaN                  NaN    Open          NaN                   NaN       Closed                   NaN          NaN
40250                  NaN                  NaN                  NaN     NaN          NaN                   NaN          NaN                   NaN          NaN

我想我还是分享我的解决方案吧:

from numpy import nan
mess = [{40258: [['2018-07-03T14:13:41'], ['Open'], ['Closed']]},
 {40257: [['2018-07-03T13:47:55',
    '2018-07-03T14:21:52',
    '2018-07-04T11:56:44'],
   ['Open', 'In Progress', 'Waiting on 3rd Party'],
   ['In Progress', 'Waiting on 3rd Party', 'In Progress']]},
 {40255: [['2018-07-03T13:12:58'], ['Open'], ['Closed']]},
 {40250: [[], [], []]}]

master = dict()
for dicto in mess:
    key = list(dicto.keys())[0]
    master[key] = {('List{}-{}'.format(j+1,i+1)): (dicto[key][j][i] if i < len(dicto[key][j]) else nan ) for i in range(3) for j in range(3)}
output = pd.DataFrame.from_records(master, columns=list(master.keys())).T
print(output.to_string())

我想我还是分享我的解决方案吧:

from numpy import nan
mess = [{40258: [['2018-07-03T14:13:41'], ['Open'], ['Closed']]},
 {40257: [['2018-07-03T13:47:55',
    '2018-07-03T14:21:52',
    '2018-07-04T11:56:44'],
   ['Open', 'In Progress', 'Waiting on 3rd Party'],
   ['In Progress', 'Waiting on 3rd Party', 'In Progress']]},
 {40255: [['2018-07-03T13:12:58'], ['Open'], ['Closed']]},
 {40250: [[], [], []]}]

master = dict()
for dicto in mess:
    key = list(dicto.keys())[0]
    master[key] = {('List{}-{}'.format(j+1,i+1)): (dicto[key][j][i] if i < len(dicto[key][j]) else nan ) for i in range(3) for j in range(3)}
output = pd.DataFrame.from_records(master, columns=list(master.keys())).T
print(output.to_string())


我想知道为什么所有的听写都是这样?如果您首先清理您正在获取的输入数据,这不是更容易吗。当您以这种方式接收数据时,我可以看到出现了一些问题,这些问题迫使您在构建/填充数据框架时具有创造性。我想你是在某种票证上填写状态更新,其中关键是票号。制作一个包含3列的数据框,并用票证所经历的操作填充该数据框(例如:您必须拆分dict 40257)。这将在数据帧中为您节省大量无意义的列。您的状态是正确的。我对结构也有类似的想法,我可以控制如何接收这些数据的结构。我这样构造它,因为我必须在每个数据点之间做进一步的计算——比如两次“转换”之间的时间(40257中的Date2-Date1)。我全神贯注地寻找更好的方法,但不太明白为什么只有3列就足够了。感谢从我目前看到的结构是:itemnumber(dictkey)、date(第一个项目列表)和2倍的状态(我假设当前状态和以前的状态,以跟踪更改?)。如果您只为票据中发生的每个事件向数据中添加一个条目,您可以稍后轻松筛选出每个项目中发生的内容。您的标题看起来像('ticket'、'date'、'current status'、'previous status')。共有4列,上一列遗漏;)我想知道为什么所有的听写都是这样?如果您首先清理您正在获取的输入数据,这不是更容易吗。当您以这种方式接收数据时,我可以看到出现了一些问题,这些问题迫使您在构建/填充数据框架时具有创造性。我想你是在某种票证上填写状态更新,其中关键是票号。制作一个包含3列的数据框,并用票证所经历的操作填充该数据框(例如:您必须拆分dict 40257)。这将在数据帧中为您节省大量无意义的列。您的状态是正确的。我对结构也有类似的想法,我可以控制如何接收这些数据的结构。我这样构造它,因为我必须在每个数据点之间做进一步的计算——比如两次“转换”之间的时间(40257中的Date2-Date1)。我全神贯注地寻找更好的方法,但不太明白为什么只有3列就足够了。感谢从我目前看到的结构是:itemnumber(dictkey)、date(第一个项目列表)和2倍的状态(我假设当前状态和以前的状态,以跟踪更改?)。如果您只为票据中发生的每个事件向数据中添加一个条目,您可以稍后轻松筛选出每个项目中发生的内容。您的标题看起来像('ticket'、'date'、'current status'、'previous status')。共有4列,上一列遗漏;)这不是一个好的实现。如果需求更改为1000大小的内部列表,会发生什么情况?你打算为此编写代码吗?我想OP已经有了主意。我们只需要再多一个for循环来构建数据数组。等等,我将编辑答案。这不是一个好的实现。如果需求更改为1000大小的内部列表,会发生什么情况?你打算为此编写代码吗?我想OP已经有了主意。我们只需要再多一个for循环来构建数据数组。等等,我会编辑答案。这太棒了,做得好。它工作得很好!您知道如何在数据中找到最长数量的元素,以便自动创建列名吗?我会搜索所有目录中的所有列表并返回3。(如果不是,我总是可以创建一个新问题)。再次感谢!您必须至少导航一次才能找到最长元素的长度。类似的东西可能会起作用
max([len(e)表示k中的d,v表示d中的v。items()表示v中的e])
如果我能投票10倍,我会的,效果很好。谢谢,非常感谢。我也是。这太棒了,做得好。它工作得很好!您知道如何在数据中找到最长数量的元素,以便自动创建列名吗?我会搜索所有目录中的所有列表并返回3。(如果不是,我总是可以创建一个新问题)。再次感谢!您必须至少导航一次才能找到最长元素的长度。类似的东西可能会起作用
max([len(e)表示k中的d,v表示d中的v。items()表示v中的e])
如果我能投票10倍,我会的,效果很好。谢谢,非常感谢。我也是。