【问题标题】:Extract a dataframe from a list of dataframes containing a substring从包含子字符串的数据框列表中提取数据框
【发布时间】:2021-01-11 14:36:33
【问题描述】:

我在 python 中有以下数据框,它们是列表的一部分

dataframe_list= []## CREATE AN EMPTY LIST
import pandas as pd
A=pd.DataFrame()
A["name"]=["A", "A", "A"]
A["att"]=["New World", "Hello", "Big Day now"]
B=pd.DataFrame()
B["name"]=["A2", "A2", "A2"]
B["Col"]=["L", "B", "B"]
B["CC"]=["old", "Hello", "Big Day now"]
C=pd.DataFrame()
C["name"]=["Brave old World", "A", "A"]

上述数据帧的大小不同。这些存储为一个列表,如下所示

 dataframe_list.append(A)
 dataframe_list.append(B)
 dataframe_list.append(C)

我正在尝试提取两个包含单词 world(不考虑大小写)的数据帧。我试过下面的代码

list1=["World"]
result=[x for x in dataframe_list if any(x.isin(list1) ) ]

然而,这会产生所有数据帧。预期的输出是数据帧 A、C。我不确定我在哪里犯了错误

【问题讨论】:

    标签: pandas dataframe string-matching


    【解决方案1】:

    DataFrame.stack 用于Series 并通过Series.str.contains 通过单词w 进行测试,而不是一个元素列表,还添加单词边界以仅匹配整个单词:

    w="World"
    result=[x for x in dataframe_list if x.stack().str.contains(rf"\b{w}\b", case=False).any()]
    print (result)
    [  name          att
    0    A    New World
    1    A        Hello
    2    A  Big Day now,               name
    0  Brave old World
    1                A
    2                A]
    

    编辑:对于单词列表,| 用于正则表达式或:

    list1=["World",'Hello']
    pat = '|'.join(rf"\b{x}\b" for x in list1)
    result=[x for x in dataframe_list if x.stack().str.contains(pat, case=False).any()]
    

    【讨论】:

    • 谢谢。快速提问。是否必须像这里所做的那样拆分字符串以匹配小子字符串
    • 再次感谢您。是否可以像您所做的那样传递单词列表而不是字符串
    • @Raghavanvmvs - 答案已编辑。在这两种解决方案中还添加了单词bondaries。这意味着如果Brave old WorldNoBrave old World1 不匹配,但Brave old World 匹配
    猜你喜欢
    • 1970-01-01
    • 2019-11-08
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 2020-02-23
    相关资源
    最近更新 更多