使用列表推导和数据帧中的字符串系列推导新列

时间:2019-08-19 04:12:45

标签: python pandas list-comprehension

我正在尝试使用列表推导(包含字符串)在数据框中派生新列。我不确定自己在做什么错,但无法在代码中找出错误。

我有一个如下列表


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)

我得到以下输出。

enter image description here

索引5,7和8的行应为“买断”,而不是“非买断”,因为它至少包含buyout_deals列表中的一个关键字。

预期结果:

enter image description here

有人可以帮我吗?我也尝试过循环,但没有得到正确的结果。 谢谢。

2 个答案:

答案 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