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

2024-09-26 18:09:11 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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(如果找到)。任何帮助都将不胜感激!谢谢


Tags: 数据text文本df字典printstringastringc
2条回答

@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())

                        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
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数据结构的附加列

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

相关问题 更多 >

    热门问题