查找名称包含特定字符串的列
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 中删除名称包含特定字符串的列