이름에 특정 문자열이 포함 된 열 찾기


137

열 이름이있는 데이터 프레임이 있는데 특정 문자열이 포함되어 있지만 정확히 일치하지 않는 데이터 프레임을 찾고 싶습니다. 내가 찾고 있어요 'spike'열 이름이 좋아에 'spike-2', 'hey spike', 'spiked-in'합니다 ( 'spike'일부는 항상 연속).

열 이름이 문자열 또는 변수로 반환되기를 원하므로 나중에 df['name']또는 df[name]정상적으로 열에 액세스합니다 . 나는 이것을 할 수있는 방법을 찾으려고 노력했다. 팁이 있습니까?

답변:


229

를 반복 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']

설명:

  1. df.columns 열 이름 목록을 반환합니다
  2. [col for col in df.columns if 'spike' in col]df.columns변수로 목록 을 반복하고 포함 col된 경우 결과 목록에 추가합니다 . 이 구문은 목록 이해 입니다.col'spike'

일치하는 열이있는 결과 데이터 세트 만 원하는 경우 다음을 수행 할 수 있습니다.

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

산출:

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

1
대단해! 그래도 작동 방식을 정확히 이해하지 못하지만 여전히 Python과 Pandas 모두에게 새롭습니다. 설명해 주시겠습니까?
erikfas

16
이것은 DataFrame.filterFYI가하는 일입니다 (원한다면 정규식을 제공 할 수도 있습니다)
Jeff

2
@xndrme include 대신 정규 표현식과 일치하는 특정 열 을 제외 하기 위해 정규 표현식을 어떻게 수행 하시겠습니까?
Dhruv Ghulati 11

3
@DhruvGhulati 에서처럼 원치 않는 열을 삭제할 수도 있습니다 . 목록에 열 df[df.columns.drop(spike_cols)]DataFrame없으면 spike_cols원하지 않는 정규 표현식을 사용하여 얻을 수 있습니다.
Alvaro Fuentes

1
더 간결한 코드 :df[[col for col in df.columns if "spike" in col]]
WindChimes

71

이 답변 은 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)

'스파이크 -2'만 출력합니다. 일부 사람들은 위의 의견에서 제안한 것처럼 정규 표현식을 사용할 수도 있습니다.

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

두 열을 모두 출력합니다 : [ 'spike-2', 'hey spke']


22

당신은 또한 사용할 수 있습니다 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 . 에 대해 자세히 알아 보십시오 .


18
# select columns containing 'spike'
df.filter(like='spike', axis=1)

이름, 정규식으로 선택할 수도 있습니다. 참조 : pandas.DataFrame.filter


1
지금까지 가장 쉬운 솔루션. 간단하면서도 강력합니다!
Cesare Iurlaro


3

이 코드를 사용할 수도 있습니다.

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

0

시작, 포함 및 종료를 기반으로 이름 및 하위 설정 가져 오기 :

# from: /programming/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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.