Python 如果在列文本字符串中找到值,如何使用字典键添加新的Dataframe列

Python 如果在列文本字符串中找到值,如何使用字典键添加新的Dataframe列,python,pandas,dictionary,Python,Pandas,Dictionary,我有一个数据框,其中一列包含文本信息 print(df): ... | ... | Text | ... | ... | StringA. StringB. StringC | ... | ... | StringZ. StringY. StringX | ... | ... | StringL. StringK. StringJ | ... | ... | StringA. StringZ. S

我有一个数据框,其中一列包含文本信息

print(df):

...   | ... |  Text                         |

...   | ... |  StringA. StringB. StringC    |
...   | ... |  StringZ. StringY. StringX    |
...   | ... |  StringL. StringK. StringJ    |
...   | ... |  StringA. StringZ. StringJ    |
我还有一本字典,它包含以下内容:

dict = {'Dogs': ['StringA', 'StringL'],'Cats': ['StringB', 'StringZ', 'StringJ'],'Birds': ['StringK', 'StringY']}
编辑:我有大约100个字典键,每个都有4个以上的值

我希望做的是在数据框中为字典中的每个键创建额外的列,然后在出现字典中的任何值时在列中放置一个“1”

因此,我试图得到的结果是:

print(df):

...   | ... |  Text                         |   Dogs   |   Cats    |   Birds

...   | ... |  StringA. StringB. StringC    |   1      |   1       |   0
...   | ... |  StringZ. StringY. StringX    |   0      |   1       |   1
...   | ... |  StringL. StringK. StringJ    |   1      |   1       |   1
...   | ... |  StringA. StringZ. StringJ    |   1      |   1       |   0
编辑:问题是我不确定如何在文本列中搜索值,然后在键列中返回1(如果找到)。任何帮助都将不胜感激!谢谢

import pandas as pd

d = {'Dogs': ['StringA', 'StringL'],'Cats': ['StringB', 'StringZ', 'StringJ'],'Birds': ['StringK', 'StringY']}
df = pd.DataFrame({'Text': ['StringA. StringB. StringC', 'StringZ. StringY. StringX', 'StringL. StringK. StringJ',
                            'StringA. StringZ. StringJ']})

for k,v in d.items(): # Key, value iteration of dict
    df[k] = df.apply(lambda x: 1 if any([s in x['Text'] for s in v]) else 0, axis=1)

# Apply lambda function to each row in the new column. If any of the values in the array is present in the text, its a 1

# Output
                        Text  Dogs  Cats  Birds
0  StringA. StringB. StringC     1     1      0
1  StringZ. StringY. StringX     0     1      1
2  StringL. StringK. StringJ     1     1      1
3  StringA. StringZ. StringJ     1     1      0
如果字符串较大或有许多字符串,则此解决方案可能不理想。在这种情况下,您可能需要添加一个具有某种Trie数据结构的附加列


但是上述解决方案应该适用于大多数中等情况。

关于@Abhihek的答案是最有效的,但这只是为了给出另一个解决方案,首先循环使用
df

import numpy as np
import pandas as pd

d = {
    'Dogs': ['StringA', 'StringL'],
    'Cats': ['StringB', 'StringZ', 'StringJ'],
    'Birds': ['StringK', 'StringY']
}

df = pd.DataFrame({
    'Text': [
        'StringA. StringB. StringC',
        'StringZ. StringY. StringX',
        'StringL. StringK. StringJ',
        'StringA. StringZ. StringJ'
    ]
})

for index in df.index:

    for key, s_elements in d.items():
        df.at[index, key] = (lambda: 1 if any([s in df['Text'][index] for s in s_elements]) else 0)()

# set the type to short integers for the columns that have been added
for key in d:
    df = df.astype({key: np.uint8})

print(df.head())


你能更具体地说明问题是什么吗?请参阅,。问题是如何在文本列中搜索值,然后在伪代码中的键列返回1(如果找到),我将在
df
的行上循环。对于每一行,检查列文本中出现的关键字值的数量,然后将计数添加到数据框中的关键字列中。我会在Pandas文档中查找如何在行上循环并向特定行添加列值。@SOK那么这个问题是的重复。非常感谢@Abhishek。当我在较小的样本上进行测试时,代码可以工作,但是当我在完整的数据帧上运行它时,我得到一个
TypeError:type'float'的参数不可编辑。你知道为什么吗?当我只使用主dataframeWelcome的一个示例时,它非常有用。“文本”列中的某个值是浮点值。或者dict中的某个值是一个float而不是list。您可以在循环之前执行df['Text']=df['Text'].astype(str)。并且还运行另一个循环,以确保dict中所有值的类型仅为list。在我对
df['Text']=df['Text']进行排序后,astype(str)
工作正常。非常感谢!!
                        Text  Dogs  Cats  Birds
0  StringA. StringB. StringC     1     1      0
1  StringZ. StringY. StringX     0     1      1
2  StringL. StringK. StringJ     1     1      1
3  StringA. StringZ. StringJ     1     1      0