根据过滤器python更新列值

问题描述 投票:0回答:3

我有两个数据集说df1和df:

DF1

    df1 = pd.DataFrame({'ids': [101,102,103],'vals': ['apple','java','python']})

   ids    vals
0  101   apple
1  102    java
2  103  python

DF

df = pd.DataFrame({'TEXT_DATA': [u'apple a day keeps doctor away', u'apple tree in my farm', u'python is not new language', u'Learn python programming', u'java is second language']})

                       TEXT_DATA
0  apple a day keeps doctor away
1          apple tree in my farm
2     python is not new language
3       Learn python programming
4        java is second language

我想要做的是想要根据过滤的数据更新列值,并将匹配数据映射到新列,以便我的输出是

                       TEXT_DATA      NEW_COLUMN
0  apple a day keeps doctor away      101
1          apple tree in my farm      101
2     python is not new language      103
3       Learn python programming      103
4        java is second language      102

我尝试过匹配使用

df[df['TEXT_DATA'].str.contains("apple")]

我有什么方法可以做到这一点?

python dataframe for-loop string-matching
3个回答
1
投票

你可以这样做:

my_words = {'python': 103, 'apple': 101, 'java': 102}
for word in my_words.keys():
    df1.loc[df1['my_column'].str.contains(word, na=False), ['my_second_column']] = my_words[word]

1
投票

首先,您需要在df1['vals']中提取值。然后,创建一个新列并将提取结果添加到新列。最后,合并两个数据帧。

extr = '|'.join(x for x in df1['vals'])
df['vals'] = df['TEXT_DATA'].str.extract('('+ extr + ')', expand=False)
newdf = pd.merge(df, df1, on='vals', how='left')

要选择结果中的字段,请在标题部分中键入列名称:

newdf[['TEXT_DATA','ids']]

0
投票

您可以使用两个数据帧的cartesian product,然后选择相关的行和列。

tmp = df.assign(key=1).merge(df1.assign(key=1), on='key').drop(columns='key')
resul = tmp.loc[tmp.apply(func=(lambda x: x.vals in x.TEXT_DATA), axis=1)]\
                              .drop(columns='vals').reset_index(drop=True)
© www.soinside.com 2019 - 2024. All rights reserved.