首页 > 解决方案 > 如何将没有字典的嵌套列表变成熊猫数据框?

问题描述

我从一个更大的嵌套字典创建了一个嵌套列表,现在想将该列表转换为数据框。我创建的列表没有键或值。

我尝试使用 dict() 将列表转换为字典,但这不起作用。该列表采用这种格式(名称和数据已更改为匿名)

['Bigclient', ['All Web Site Data', '129374116'], 'Otherclient', ['All Web Site Data', '164548948'], ['Filtered website data', '142386573'], ['Test ','72551604']。

所以我有一个父值“Bigclient”,然后有一个子列表,包括数据名称和与该名称对应的 ID 号。每个父值都有不同数量的子对。我想制作一个像这样具有三列的数据框

Client_name  dataname  ID
BigClient    All Web   129374116
Other Client All web   164548948
Other Client Filtered  142386573
Other Client Test      7255160

因此客户端名称(父值)用于对数据名和 id 进行分组

new =[]
for item in data['items']:
    name = item.get('name')
    if name:
        new.append(name)
        webprop = item.get('webProperties')
        if webprop:
            for profile in webprop:
                profile = profile.get('profiles')
                if profile:
                    for idname in profile:
                        idname = idname.get('name')
                    for idname1 in profile:
                        idname1 = idname1.get('id')
                    if idname:
                        result = [idname, idname1]
                    new.append(result)
                else:
                    continue
        else:
            continue

这就是我建立我的列表的方式,但是它没有字典。

标签: pythondictionarynested-lists

解决方案


干得好:

import pandas as pd

raw_data = ['Bigclient', ['All Web Site Data', '129374116'], 'Otherclient', ['All Web Site Data', '164548948'], ['Filtered website data', '142386573'], ['Test', '72551604']]

# collect dsata
keys_list = []
values_list = [[] for _ in range(2)]
count = -1
for item in raw_data:
    if isinstance(item, str):
        keys_list.append(item)
        count += 1
    else:
        values_list[count].append(item)

# create data dictionary
data_dict = dict(zip(keys_list, values_list))

# create data frame
raw_df = pd.DataFrame(columns=['Client_name', 'data'])
for key, values in data_dict.items():
    for value in values:
        raw_df = raw_df.append({'Client_name': key, 'data': value}, ignore_index=True)

# split list data into 2 columns
spilt_data = pd.DataFrame(raw_df['data'].values.tolist(), columns=['dataname','ID'])
# concat data
result = pd.concat([raw_df, spilt_data], axis=1, sort=False)
# drop used column
result = result.drop(['data'], axis=1)

输出:

   Client_name               dataname         ID
0    Bigclient      All Web Site Data  129374116
1  Otherclient      All Web Site Data  164548948
2  Otherclient  Filtered website data  142386573
3  Otherclient                   Test   72551604

推荐阅读