Как добавить новый столбец Dataframe с ключом словаря, если значение найдено в текстовой строке столбца - PullRequest
2 голосов
/ 01 мая 2020

У меня есть фрейм данных, в котором один столбец содержит текстовую информацию.

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, если найден в столбце Ключ. Любая помощь приветствуется! Спасибо!

Ответы [ 2 ]

1 голос
/ 01 мая 2020

Ответ @Abhihek является наиболее эффективным, но просто для того, чтобы дать другое решение, где вы oop выше 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
1 голос
/ 01 мая 2020
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

Это решение может быть неоптимальным, если строки большие или в них много строк. В этом случае вам может понадобиться добавить дополнительный столбец с некоторой структурой данных Tr ie.

Но приведенное выше решение должно работать в большинстве умеренных случаев.

...