我试图过滤掉数据帧的行,其中名称“question”下的字符串列包含给定列表中的所有子字符串。也就是说,如果给定的子字符串列表是
['King', 'England']
,那么我需要保留数据框中
df.question
中的字符串同时包含
King
和
England
的所有行。
此代码执行时无需任何问题并打印出布尔值:
print(all([word in df.question[0] for word in ['King', 'England']]))
但是此代码会导致以下错误:
print(df[all([word in df.question for word in ['King', 'England']])])
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
File ~\anaconda3\Lib\site-packages\pandas\core\indexes\base.py:3805, in Index.get_loc(self, key)
3804 try:
-> 3805 return self._engine.get_loc(casted_key)
3806 except KeyError as err:
File index.pyx:167, in pandas._libs.index.IndexEngine.get_loc()
File index.pyx:196, in pandas._libs.index.IndexEngine.get_loc()
File pandas\\_libs\\hashtable_class_helper.pxi:7081, in pandas._libs.hashtable.PyObjectHashTable.get_item()
File pandas\\_libs\\hashtable_class_helper.pxi:7089, in pandas._libs.hashtable.PyObjectHashTable.get_item()
KeyError: False
The above exception was the direct cause of the following exception:
KeyError Traceback (most recent call last)
Cell In[9], line 2
1 print(all([word in df.question[0] for word in ['King', 'England']]))
----> 2 print(df[all([word in df.question for word in ['King', 'England']])])
File ~\anaconda3\Lib\site-packages\pandas\core\frame.py:4102, in DataFrame.__getitem__(self, key)
4100 if self.columns.nlevels > 1:
4101 return self._getitem_multilevel(key)
-> 4102 indexer = self.columns.get_loc(key)
4103 if is_integer(indexer):
4104 indexer = [indexer]
File ~\anaconda3\Lib\site-packages\pandas\core\indexes\base.py:3812, in Index.get_loc(self, key)
3807 if isinstance(casted_key, slice) or (
3808 isinstance(casted_key, abc.Iterable)
3809 and any(isinstance(x, slice) for x in casted_key)
3810 ):
3811 raise InvalidIndexError(key)
-> 3812 raise KeyError(key) from err
3813 except TypeError:
3814 # If we have a listlike key, _check_indexing_error will raise
3815 # InvalidIndexError. Otherwise we fall through and re-raise
3816 # the TypeError.
3817 self._check_indexing_error(key)
KeyError: False
如何根据此条件过滤数据框中的行?
出现错误是因为正在尝试使用布尔值对 DataFrame 进行索引。 Pandas 将其解释为对列标签的引用,而 False 不是有效的列标签。
可以使用以下方法解决此问题:
-
使用
apply
和 lambda 函数:
df[df['question'].apply(lambda text: all(word in text for word in ['King', 'England']))]
这会将 lambda 函数应用于“question”列中的每一行。该函数检查所有子字符串是否存在于文本中,并返回 True 或 False。然后将这些布尔值用于过滤 DataFrame。
- 使用列表推导式创建布尔索引:
mask = [all(word in text for word in ['King', 'England']) for text in df['question']]
df[mask]
这会创建一个与 DataFrame 行数相同的布尔值列表。如果该行中的文本包含所有子字符串,则列表中的每个值都为 True,否则为 False。然后使用此布尔列表过滤 DataFrame。
这两种方法都将返回一个新的 DataFrame,其中只包含“question”列中同时包含“King”和“England”的所有行的行。
标签:python,pandas,dataframe From: 78802365