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