使用字典中的键从数据框中检索值

时间:2019-10-23 17:29:10

标签: python pandas dataframe filter iteration

我正在尝试按其行业过滤股票行情代码。我找不到使用创建的词典引入所有股票代号的方法。如何遍历字典中的键以将股票代号引入各自的列表中?我是python的新手,我相信有一种相对简单的方法,我只是找不到它。

我的数据框如下:

Symbol      industry
TXG         Biotechnology
YI          Medical
PIH         Property Insurers
PIHPP       Property Insurers

除了还有成千上万的行。

# I'm bringing in the values from the column 'industry' and create a dictionary:

industries_var = all_tickers['industry'].values
industries = {industry_name: [] for industry_name in industries_var}

# now I want to iterate through the name of every list in my dictionary 
# and append the matching symbol to the industry name in the dataframe:

for key in industries:
    if all_tickers['industry'].str.contains(key, na=False).any():
        industries.append(all_tickers['Symbol'].values)

我收到错误代码:AttributeError:'dict'对象没有属性'append'

我希望字典看起来像这样:

industries = {Biotechnology: ['TXG']
              Medical: ['YI']
              Property Insurers: ['PIH', 'PIHPP']}

我知道您可以在数据框中手动键入每个行业以分别过滤每个列表,但是由于有成千上万的数据行,因此我在上面寻找像我这样的迭代,所以只是一个有效的迭代。

谢谢!

2 个答案:

答案 0 :(得分:0)

以前很可能会问过类似的问题,但是我相信这种解决方案可以解决您的问题。

使用每个行业及其内的符号填充字典:

industries = {}
for industry in df.industry.unique():
    industries[industry] = df.loc[df.industry == industry].Symbol.unique()

for循环遍历DataFrame中的每个独特行业。然后,它将这些行业用作字典的键,并为每个键分配一个数组,其中包含分配给该行业的符号。

答案 1 :(得分:0)

您需要两个概念来完成所需的工作:1)Python defaultdict 2)Pandas / numpy条件布尔掩码。这是使用您的DataFrame的有效示例:

import pandas as pd
from collections import defaultdict
all_tickers = pd.DataFrame({'Symbol': ['TXG', 'YI', 'PIH', 'PIHPP'], 'industry': ['Biotechnology', 'Medical', 'Property Insurers', 'Property Insurers']})

industries_var = set(all_tickers['industry'].values)
industries = defaultdict(list)

for k in industries_var:
    industries[k].append(all_tickers[all_tickers.industry == k]['Symbol'].unique())

industries = dict(industries)

请注意,您不需要最后需要像我一样转换回普通字典;普通dict和defaultdict可以相同地操作,但是如果您出于任何原因要打印到屏幕上,普通dict看起来会更好一些。

最后,这是关于defaultdict的真正全面的讨论: How does collections.defaultdict work?