Python-通过复制创建新的DF列-从现有列值进行部分字符串匹配

Python-通过复制创建新的DF列-从现有列值进行部分字符串匹配,python,string,dataframe,Python,String,Dataframe,我有一个带有50k条记录的数据帧,其中一个列值如下 DF\n 我正在从列中查找关键字-3Y,3M,2Y和1Y,如果找到,需要将值复制到新的DF列名期限,3M,1M等。 如果未找到,它可以显示FALSE或NAN 我尝试了以下代码 df['Tenor'] = ""\n df['Tenor'] = df.column.apply(lambda x: x in ['3Y','3M,'1Y','1M'] 这将在新列的所有行中返回为FALSE。 您能告诉我满足我的要求的最佳方法是什么吗?您可以使用正则表

我有一个带有50k条记录的数据帧,其中一个列值如下

DF\n

我正在从
中查找关键字-
3Y
3M
2Y
1Y
,如果找到,需要将值复制到新的DF列名
期限
3M
1M
等。 如果未找到,它可以显示
FALSE
NAN

我尝试了以下代码

df['Tenor'] = ""\n

df['Tenor'] = df.column.apply(lambda x: x in ['3Y','3M,'1Y','1M']
这将在新列的所有行中返回为
FALSE
。 您能告诉我满足我的要求的最佳方法是什么吗?

您可以使用正则表达式:

import pandas as pd

df = pd.DataFrame(dict(
    COLUMN = [
        'ABC-1M-Deliveryorder','KGF-ORDERDelivery-2Y',
        'DEFGHIABC1M-OPEN', 'KGFABC', 'ABC-3Y-ORDER'
    ]
))

df['Tenor'] = df['COLUMN'].str.contains('3Y|3M|2Y|1Y|1M', regex=True)
编辑:OP提出了后续问题:


无论列在哪里找到字符串2Y、3Y等,上述代码段都返回TRUE。。但我需要以下索引列的输出新0 ABC-1M-Deliveryorder 1M 1 KGF-ORDERDelivery-2Y 2Y 2 DEFGHIABC1M-OPEN 1M 3 KGFABC Nan 4 ABC-3Y-ORDER 3Y

如果是这种情况,则可能需要使用自定义函数和
pandas.Series.apply
如下所示:

import pandas as pd

df = pd.DataFrame(dict(
    COLUMN = [
        'ABC-1M-Deliveryorder','KGF-ORDERDelivery-2Y',
        'DEFGHIABC1M-OPEN', 'KGFABC', 'ABC-3Y-ORDER'
    ]
))

def find_substring(x):
    for y in ('3Y','3M','2Y','1Y','1M'):
        if y in x:
            return y

df['Tenor'] = df['COLUMN'].apply(find_substring)

print(df)

输出:

                 COLUMN Tenor
0  ABC-1M-Deliveryorder    1M
1  KGF-ORDERDelivery-2Y    2Y
2      DEFGHIABC1M-OPEN    1M
3                KGFABC  None
4          ABC-3Y-ORDER    3Y


无论列在哪里找到字符串2Y、3Y等,上述代码段都返回TRUE

但我需要的输出如下 代码输出

'''

新索引列 0 ABC-1M-Deliveryorder 1M 1 KGF-ORDERDelivery-2Y 2Y 2除雾器1米-开启1米 3 KGFABC-Nan 4 ABC-3Y-订单3Y


无论列在哪里找到字符串2Y、3Y等,上述代码段都返回TRUE。。但我需要以下索引列的输出新0 ABC-1M-Deliveryorder 1M 1 KGF-ORDERDelivery-2Y 2Y 2 DEFGHIABC1M-OPEN 1M 3 KGFABC Nan 4 ABC-3Y-ORDER3Y@Dax2ib我用一个例子更新了我的答案,说明了你是如何做到这一点的。
                 COLUMN Tenor
0  ABC-1M-Deliveryorder    1M
1  KGF-ORDERDelivery-2Y    2Y
2      DEFGHIABC1M-OPEN    1M
3                KGFABC  None
4          ABC-3Y-ORDER    3Y