查找名称包含特定字符串的列

Posted

技术标签:

【中文标题】查找名称包含特定字符串的列【英文标题】:Find column whose name contains a specific string 【发布时间】:2022-01-17 17:51:25 【问题描述】:

我有一个带有列名的数据框,我想找到一个包含某个字符串但不完全匹配的数据框。我在'spike-2''hey spike''spiked-in' 等列名中搜索'spike''spike' 部分始终是连续的)。

我希望将列名作为字符串或变量返回,因此稍后我会像往常一样使用df['name']df[name] 访问该列。我试图找到方法来做到这一点,但无济于事。有什么建议吗?

【问题讨论】:

【参考方案1】:

只需遍历DataFrame.columns,现在这是一个示例,您最终将得到一个匹配的列名列表:

import pandas as pd

data = 'spike-2': [1,2,3], 'hey spke': [4,5,6], 'spiked-in': [7,8,9], 'no': [10,11,12]
df = pd.DataFrame(data)

spike_cols = [col for col in df.columns if 'spike' in col]
print(list(df.columns))
print(spike_cols)

输出:

['hey spke', 'no', 'spike-2', 'spiked-in']
['spike-2', 'spiked-in']

解释:

    df.columns 返回列名列表 [col for col in df.columns if 'spike' in col] 使用变量 col 遍历列表 df.columns,如果 col 包含 'spike',则将其添加到结果列表中。此语法为list comprehension。

如果您只想要包含匹配列的结果数据集,您可以这样做:

df2 = df.filter(regex='spike')
print(df2)

输出:

   spike-2  spiked-in
0        1          7
1        2          8
2        3          9

【讨论】:

这是DataFrame.filter 的作用仅供参考(如果需要,您可以提供正则表达式) @xndrme 您将如何使用正则表达式来排除与正则表达式匹配而不是包含的特定列? @DhruvGhulati 也可以像在df[df.columns.drop(spike_cols)] 中那样删除不需要的列,在那里你会得到一个DataFrame,而spike_cols 列表中没有你可以使用不需要的正则表达式获得的列。 更简洁的代码:df[[col for col in df.columns if "spike" in col]] @JacoSolari [col for col in df.columns if any(s in col for s in ['spike', 'foo', 'bar'])]df.filter(regex='(spike)|(foo)|(bar)')【参考方案2】:

This answer 使用 DataFrame.filter 方法在没有列表理解的情况下执行此操作:

import pandas as pd

data = 'spike-2': [1,2,3], 'hey spke': [4,5,6]
df = pd.DataFrame(data)

print(df.filter(like='spike').columns)

将只输出“spike-2”。您也可以使用正则表达式,正如上面 cmets 中的某些人所建议的那样:

print(df.filter(regex='spike|spke').columns)

将输出两列:['spike-2', 'hey spke']

【讨论】:

我有很多列,我使用了这段代码,它似乎跳过了一些名称!在这个例子中,想象一下运行这段代码而不返回“hey spke”列! 按名称排除某些列怎么样?我们该怎么做呢?【参考方案3】:

你也可以使用df.columns[df.columns.str.contains(pat = 'spike')]

data = 'spike-2': [1,2,3], 'hey spke': [4,5,6], 'spiked-in': [7,8,9], 'no': [10,11,12]
df = pd.DataFrame(data)

colNames = df.columns[df.columns.str.contains(pat = 'spike')] 

print(colNames)

这将输出列名:'spike-2', 'spiked-in'

更多关于pandas.Series.str.contains。

【讨论】:

【参考方案4】:

您也可以使用此代码:

spike_cols =[x for x in df.columns[df.columns.str.contains('spike')]]

【讨论】:

【参考方案5】:
# select columns containing 'spike'
df.filter(like='spike', axis=1)

您也可以按名称、正则表达式进行选择。参考:pandas.DataFrame.filter

【讨论】:

迄今为止最简单的解决方案。简单而强大! 这是一个错误的答案。请注意,问题要求返回带有给定字符串或模式的“列名”,例如spike.【参考方案6】:
df.loc[:,df.columns.str.contains("spike")]

【讨论】:

虽然它没有完全回答原始问题,但我真的很喜欢这个解决方案,因为它直接返回切片的 DataFrame(这实际上也可能是 OP 所追求的)。【参考方案7】:

根据 Start、Contains 和 Ends 获取名称和子集:

# from: https://***.com/questions/21285380/find-column-whose-name-contains-a-specific-string
# from: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.str.contains.html
# from: https://cmdlinetips.com/2019/04/how-to-select-columns-using-prefix-suffix-of-column-names-in-pandas/
# from: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.filter.html




import pandas as pd



data = 'spike_starts': [1,2,3], 'ends_spike_starts': [4,5,6], 'ends_spike': [7,8,9], 'not': [10,11,12]
df = pd.DataFrame(data)



print("\n")
print("----------------------------------------")
colNames_contains = df.columns[df.columns.str.contains(pat = 'spike')].tolist() 
print("Contains")
print(colNames_contains)



print("\n")
print("----------------------------------------")
colNames_starts = df.columns[df.columns.str.contains(pat = '^spike')].tolist() 
print("Starts")
print(colNames_starts)



print("\n")
print("----------------------------------------")
colNames_ends = df.columns[df.columns.str.contains(pat = 'spike$')].tolist() 
print("Ends")
print(colNames_ends)



print("\n")
print("----------------------------------------")
df_subset_start = df.filter(regex='^spike',axis=1)
print("Starts")
print(df_subset_start)



print("\n")
print("----------------------------------------")
df_subset_contains = df.filter(regex='spike',axis=1)
print("Contains")
print(df_subset_contains)



print("\n")
print("----------------------------------------")
df_subset_ends = df.filter(regex='spike$',axis=1)
print("Ends")
print(df_subset_ends)

【讨论】:

【参考方案8】:

返回具有所需列的 df 子集的另一种解决方案:

df[df.columns[df.columns.str.contains("spike|spke")]]

【讨论】:

以上是关于查找名称包含特定字符串的列的主要内容,如果未能解决你的问题,请参考以下文章

如何在数据框名称而不是列中查找字符串?

从 pandas DataFrame 中删除名称包含特定字符串的列

AIX:查找名称包含特定字符串的文件并将其添加到列表中

查找所有包含字符串的表,不包括名称为字符串的表

R语言apropos函数查找包含特定字符的函数find函数查找函数所在的位置实战

如何使用熊猫查找重复名称?