如何从两个DICT Python构建数据帧

如何从两个DICT Python构建数据帧,python,pandas,dataframe,beautifulsoup,Python,Pandas,Dataframe,Beautifulsoup,我正在尝试构建一个数据帧,在其中尝试从dicts中获取数据和列。(我试着用pd.Series做这件事,但还是遇到了一些问题。) 这将导致TypeError:unhabable类型:“dict”示例如下(第一列不是索引): 这里尝试构建一个dict,其中key对应于过滤器值,value对应于可能的选择列表。它适合你的需要吗 import requests import pandas as pd from bs4 import BeautifulSoup # get link and parse

我正在尝试构建一个数据帧,在其中尝试从
dicts
中获取
数据
。(我试着用
pd.Series
做这件事,但还是遇到了一些问题。)

这将导致
TypeError:unhabable类型:“dict”
示例如下(第一列不是索引):


这里尝试构建一个dict,其中key对应于过滤器值,value对应于可能的选择列表。它适合你的需要吗

import requests
import pandas as pd
from bs4 import BeautifulSoup

# get link and parse
page = requests.get('https://www.finviz.com/screener.ashx?v=111&ft=4')
soup = BeautifulSoup(page.text, 'html.parser')

all_dict = {}
filters = soup.find_all('td', attrs={'class': 'filters-cells'})
for i in range(len(filters) // 2):
    i_title = 2 * i
    i_value = 2 * i + 1
    sct = filters[i_title].find_all('span', attrs={'class': 'screener-combo-title'})
    if len(sct)== 1:
        title = ' '.join(sct[0].stripped_strings)      
        values = [v.text for v in filters[i_value].find_all('option', attrs={'value': True}) if v.text]
        all_dict[title] = values

max_element = max([len(v) for v in all_dict.values()])
for k in all_dict:
    all_dict[k] = all_dict[k] + [''] * (max_element - len(all_dict[k]))
df = pd.DataFrame.from_dict(all_dict) 

您的变量
过滤器
未定义。当我定义
df=pd.DataFrame([all_dict])
时,它返回以下形状:
[1行x 63列]
。根据我的理解,传入dict将为每个键创建一列,其中的行由值填充。同样的结果,当我做
。从_dict
。也许我构建的df是错误的?我不明白您想要创建什么数据帧:每列的值数量不同。你想要一个pd.Series的列表吗?下面是一个例子:data={'col_1':[3,2,1,0],'col_2':['a','b','c','d'];DataFrame.来自dict(data)的DataFrame示例发布在我文章的底部附近。
Exchange    Index     ...
amex     s&p500     ...
nasd     djia
nyse
import requests
import pandas as pd
from bs4 import BeautifulSoup

# get link and parse
page = requests.get('https://www.finviz.com/screener.ashx?v=111&ft=4')
soup = BeautifulSoup(page.text, 'html.parser')

all_dict = {}
filters = soup.find_all('td', attrs={'class': 'filters-cells'})
for i in range(len(filters) // 2):
    i_title = 2 * i
    i_value = 2 * i + 1
    sct = filters[i_title].find_all('span', attrs={'class': 'screener-combo-title'})
    if len(sct)== 1:
        title = ' '.join(sct[0].stripped_strings)      
        values = [v.text for v in filters[i_value].find_all('option', attrs={'value': True}) if v.text]
        all_dict[title] = values

max_element = max([len(v) for v in all_dict.values()])
for k in all_dict:
    all_dict[k] = all_dict[k] + [''] * (max_element - len(all_dict[k]))
df = pd.DataFrame.from_dict(all_dict)