【问题标题】:Update a column value based on filter python根据过滤器python更新列值
【发布时间】:2019-08-04 05:06:32
【问题描述】:

我有两个数据集,分别是 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


【解决方案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]

【讨论】:

  • 这给了我错误“ValueError: cannot index with vector contains NA / NaN values”。如果可能的话,你可以给我一个输出
  • 已编辑答案以修正 NaN 值。
  • "my_words = {'python': 103, 'apple': 101, 'java': 102} for my_words.keys() 中的单词:df.loc[df['TEXT_DATA']。 str.contains(word, na=False), ['TEXT_DATA']] = my_words[word] " 覆盖值,它不会添加另一列
  • 代码输出“TEXT_DATA 0 101 1 101 2 103 3 103 4 102”
  • 我编辑了答案,但这是您真正可以通过查看答案几分钟来研究的内容。
【解决方案2】:

首先,您需要提取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']]

【讨论】:

    【解决方案3】:

    您可以使用两个数据框的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)
    

    【讨论】:

    • 这给了我错误'TypeError: drop() got an unexpected keyword argument 'columns''
    猜你喜欢
    • 2018-12-20
    • 2021-08-08
    • 2015-05-17
    • 2021-04-10
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    • 2021-11-25
    • 1970-01-01
    相关资源
    最近更新 更多