【问题标题】:Adding value to new column based on if two other columns match根据其他两列是否匹配为新列添加值
【发布时间】:2021-04-20 10:40:47
【问题描述】:

我有一个看起来像这样的数据框 (df1);

title score id timestamp Stock_name
Biocryst ($BCRX) continues to remain undervalued 120 mfuz84 2021-01-28 21:32:10

...然后继续 44000 更多行。我有另一个看起来像这样的数据框(df2);

Company name Symbol
BioCryst Pharmaceuticals, Inc. BCRX
GameStop GME
Apple Inc. AAPL

...包含所有在纳斯达克和纽约证券交易所上市的股票。然而,我现在想要做的是将股票的代码添加到 df1 中的“Stock_name”列中。为此,我想将 df1[title] 与 df2[Symbol] 匹配,然后根据标题中匹配的符号,将相应的股票名称(df2[Company name])添加到 df1[ Stock_name] 列。如果标题中有多个股票名称,我想使用提到的第一个。

有什么简单的方法吗?

【问题讨论】:

标签: python pandas


【解决方案1】:

我尝试了这个小数据集,它正在工作,如果你有问题,请告诉我

df1 = pd.DataFrame({"title" :   ["Biocryst ($BCRX) continues to remain undervalued", "AAPL is good, buy it"], 'score' : [120,420]   , 'Stock_name' : ["",""]    })
df2 = pd.DataFrame({'Company name' : ['BioCryst Pharmaceuticals, Inc.','GameStop','Apple Inc.'], 'Symbol' : ["BCRX","GME","AAPL"]})

df1
                                               title    score   Stock_name
0   Biocryst ($BCRX) continues to remain undervalued    120 
1   AAPL is good, buy it                                420


df2
                     Company name   Symbol
0   BioCryst Pharmaceuticals, Inc.  BCRX
1   GameStop                        GME
2   Apple Inc.                      AAPL

for j in range(0,len(df2)):
  for i in range(0,len(df1)):
    if df2['Symbol'][j] in df1['title'][i]:
      df1['Stock_name'][i] = df2['Symbol'][j]


df1

                                               title    score   Stock_name
0   Biocryst ($BCRX) continues to remain undervalued    120     BCRX
1   AAPL is good, buy it                                420     AAPL

【讨论】:

  • 我收到以下错误; “TypeError:'in ' 需要字符串作为左操作数,而不是 Series”。我已经尝试运行以下 "df2["Symbol"]= df2["Symbol"].astype(str)" 但不幸的是,这似乎并没有解决我收到错误的问题。当我手动创建一个包含一些条目的新数据框时,该代码确实有效。关于为什么会发生这种情况的任何想法?非常感谢任何帮助,谢谢!
【解决方案2】:

首先,我认为您应该根据df2 创建一个字典。

symbol_lookup = dict(zip(df2['Symbol'],df2['Company name']))

然后你需要一个函数来解析title 列。如果您可以依赖以美元符号开头的股票代码,则可以使用以下内容:

def find_name(input_string):
    for symbol in input_string.split('$'):
        #if the first four characters form 
        #a stock symbol, return the name
        if symbol_lookup.get(symbol[:4]):
            return symbol_lookup.get(symbol[:4])
        #otherwise check the first three characters
        if symbol_lookup.get(symbol[:3]):
            return symbol_lookup.get(symbol[:3])

您还可以根据期望符号在括号中来编写函数。如果你不能依赖任何一个,那就更复杂了。

最后,您可以将您的函数应用到title 列:

df1['Stock_name'] = df1['title'].apply(find_name)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 2021-10-05
    • 2022-11-16
    相关资源
    最近更新 更多