我正在尝试使用列表推导(包含字符串)在数据框中派生新列。我不确定自己在做什么错,但无法在代码中找出错误。
我有一个如下列表
buyout_deals = ['BIMBO', 'EBO', 'IBI', 'IBO', 'MBI', 'MBO', 'Secondary buyout', 'Take Private']
我正在尝试使用上面的列表在我的数据框中导出一个新列,并在名为Deal_Type的列中派生,该列包含以','分隔的字符串
Announced_Date Deal_Nature Deal_Type
0 2019-05-14 Recommended Acquisition,Cross border,Private
1 2019-05-14 Recommended Acquisition,Buy & Build,Domestic,Private
2 2019-05-14 Recommended Acquisition,Domestic,Insolvency,Private
3 2019-05-14 Recommended Acquisition,Domestic,Private
4 2019-05-14 Recommended Acquisition,Buy & Build,Cross border,Private,T...
5 2019-05-14 Recommended Acquisition,Domestic,IBO,Private
6 2019-05-14 Recommended Acquisition,Cross border,Private,Transatlantic
7 2019-05-14 Recommended Acquisition,Domestic,MBO,Private
8 2019-05-14 Recommended Acquisition,Domestic,Exit,MBO,Private,Secondar...
9 2019-05-14 Recommended Acquisition,Cross border,Divestment,Private
我试图在Deal_Type列的buyout_deals列表中找到任何1个关键字。如果包含,则新列将显示为“购买”,否则显示为“非购买”。
下面是我尝试过的函数(以及许多其他方法),但是我无法获得预期的结果。
def buyout_nonbuyout(row):
if row['Deal_Type'] in buyout_deals:
return 'Buyout'
else:
return 'Non-Buyout'
df = df.assign(Buyout_NonBuyout=df.apply(buyout_nonbuyout, axis=1))
df.head(10)
我得到以下输出。
索引5,7和8的行应为“买断”,而不是“非买断”,因为它至少包含buyout_deals列表中的一个关键字。
预期结果:
有人可以帮我吗?我也尝试过循环,但没有得到正确的结果。 谢谢。
答案 0 :(得分:0)
您可能需要尝试如下操作:
def buyout_nonbuyout(row):
deal_types = row['Deal_Type'].split(',')
for deal_type in deal_types:
if deal_type in buyout_deals:
return 'Buyout'
return 'Non-Buyout'
答案 1 :(得分:0)
select
array['level1', 'level2', a.ordinality-1,'level3',b.ordinality-1]::varchar[] as path,
b.value->>'priority'
from
jsonb_array_elements(JJJ #> '{level1,level2}') with ordinality as a,
jsonb_array_elements(value->'level3') with ordinality as b