获取 Pandas DataFrame 列中字符串列表中的所有行 - 此模式具有匹配组

Posted

技术标签:

【中文标题】获取 Pandas DataFrame 列中字符串列表中的所有行 - 此模式具有匹配组【英文标题】:Get all rows in a Pandas DataFrame column that are in a list of strings - This pattern has match groups 【发布时间】:2021-09-23 11:38:09 【问题描述】:

考虑代码

将熊猫导入为 pd

# dfs
df_sample = pd.read_csv('...........')
array = ['' , '' , '' ....]

pattern = '|'.join(array)
# get all the rows
print(df_sample.COLUMN_NAME_XXX.str.contains(pattern))

如何获取列的内容,而不是目前的 TRUE/FALSE?

自从我不断收到这个:

manipulations.py:17: UserWarning: This pattern has match groups. To actually get the groups, use str.extract.
  print(df_sample.COLUMN_NAME_XXX.str.contains(pattern))
0        False
1         True
2        False
3          NaN
4          NaN
         ...  
10942    False
10943      NaN
10944      NaN
10945      NaN
10946      NaN
Name: COLUMN_NAME_XXX, Length: 568743243, dtype: object

【问题讨论】:

UserWarning 说要使用str.extract,你试过了吗?如果您实际上根据您的模式数组共享几个输入行和预期输出,那会更容易 试试这个:df_sample[df_sample.COLUMN_NAME_XXX.str.contains(pattern)]。它会给你那些包含你指定的模式的过滤行。 @MEdwin:它给了ValueError: Cannot mask with non-boolean array containing NA / NaN values 【参考方案1】:

通过fillna()尝试:

m=df_sample.COLUMN_NAME_XXX.str.contains(pattern).fillna(False)
#Finally:
out=df[m]
#OR
out=df.loc[m]

现在,如果您打印 out,您将获得过滤后的数据框

【讨论】:

如何强制contains 只返回模式中的整个单词的结果? @JAN 然后使用isin() 而不是str.contains() m=df_sample.COLUMN_NAME_XXX.isin(array) 好的,谢谢!最后一件事,我需要另辟蹊径,这意味着检查array 的元素之一是否在列中,而不是数组中的列是否...注意启发一点?跨度> @JAN 你可以这样做:df_sample.COLUMN_NAME_XXX.map(lambda x:True if x in array else False)【参考方案2】:

您应该能够将该逻辑数组直接传递回数据帧切片运算符,例如:

df_sample[df_sample.COLUMN_NAME_XXX.str.contains(pattern)]

应该返回满足方括号内条件的所有行。条件可以通过如下格式链接起来:

[(condition1) | (condition2)]  #OR
[(condition1) & (condition2)]  #AND

它似乎自动将 NaN 映射到 False,但如果不是,您可以通过添加 .fillna(value = False) 将其作为另一个步骤添加到布尔数据框:

df_sample[df_sample.COLUMN_NAME_XXX.str.contains(pattern).fillna(value = False)]

【讨论】:

拍摄ValueError: Cannot mask with non-boolean array containing NA / NaN values 好的,所以您需要将 NaN 值替换为 False。尝试将 .fillna(value = False) 添加到条件中以使其: df_sample[df_sample.COLUMN_NAME_XXX.str.contains(pattern).fillna(value = False) ]

以上是关于获取 Pandas DataFrame 列中字符串列表中的所有行 - 此模式具有匹配组的主要内容,如果未能解决你的问题,请参考以下文章

修改pandas dataframe列中的字符串

pandas使用query函数基于dataframe字符串数据列中字符串的长度筛选dataframe的数据行(specific column string length)

删除 pandas DataFrame 列中字符串条目的结尾

pandas:根据另一列中的值获取与相应索引的确切对应值

检查 Pandas DataFrame 列中的字符串是不是在字符串列表中

pandas移除dataframe字符串数据列中的后N个字符(remove the last n characters from values from column of dataframe)