Python 为索引中的不同子字符串选择具有for循环的数据帧行

Python 为索引中的不同子字符串选择具有for循环的数据帧行,python,pandas,Python,Pandas,我有一个带有索引的数据帧: A B C D flowers blue 0.714550 0.208125 -0.216861 good trucks red -0.950056 1.779076 0.489394 average flowers red 0.249905 0.852931 -0.226787 bad trucks blue 1.183972 1.120614 0.

我有一个带有索引的数据帧:

               A         B         C         D
flowers blue  0.714550  0.208125 -0.216861  good
trucks red   -0.950056  1.779076  0.489394  average    
flowers red   0.249905  0.852931 -0.226787  bad
trucks blue   1.183972  1.120614  0.085162  good
现在,我想使用以下函数选择包含我要查找的子字符串的所有行:

def select(df, substring):
    """Select by substring from Dataframe"""    
    for i in substring:
        return df[df.index.to_series().str.contains(i)] 
如果我尝试:

select(df, ['flowers', 'trucks'])
它只返回第一次迭代的数据选择(flowers)


有什么想法吗?

您在第一次迭代时返回函数本身,因此它永远不会进入“trucks”参数

你需要像这样的东西

def select(df, substring):
    """Select by substring from Dataframe"""
    frames = []    
    for i in substring:
        frames.append(df[df.index.to_series().str.contains(i)])
    return pd.concat(frames)
def select(df, substring):
    return df[df.index.to_series().str.contains("|".join(substring))]
尽管上述函数可以返回与数据帧中不同的行顺序

我会用像这样的东西

def select(df, substring):
    """Select by substring from Dataframe"""
    frames = []    
    for i in substring:
        frames.append(df[df.index.to_series().str.contains(i)])
    return pd.concat(frames)
def select(df, substring):
    return df[df.index.to_series().str.contains("|".join(substring))]

这里,我们将传递多个子字符串参数,这些参数由管道操作符分隔,如
flowers | trucks

您将在第一次迭代时返回函数本身,因此它永远不会到达“trucks”参数

你需要像这样的东西

def select(df, substring):
    """Select by substring from Dataframe"""
    frames = []    
    for i in substring:
        frames.append(df[df.index.to_series().str.contains(i)])
    return pd.concat(frames)
def select(df, substring):
    return df[df.index.to_series().str.contains("|".join(substring))]
尽管上述函数可以返回与数据帧中不同的行顺序

我会用像这样的东西

def select(df, substring):
    """Select by substring from Dataframe"""
    frames = []    
    for i in substring:
        frames.append(df[df.index.to_series().str.contains(i)])
    return pd.concat(frames)
def select(df, substring):
    return df[df.index.to_series().str.contains("|".join(substring))]

在这里,我们传递由管道操作符分隔的多个子字符串参数,如
flowers | trucks

为什么不执行
df.loc[df.index.to_series().str.contains(['flowers',trucks'])]
?为什么不执行
df.loc[df.index.to_series().str.contains(['flowers',trucks'])]
?干杯。正是我想要的。干杯。正是我想要的。