이름에 panda DataFrame의 특정 문자열이 포함된 열을 삭제합니다.
다음과 같은 열 이름을 가진 팬더 데이터 프레임을 가지고 있습니다.
결과 1, 시험 1, 시험 2, 시험 2, 결과 3, 시험 3 등...
이름에 "Test"라는 단어가 포함된 모든 열을 삭제하고 싶습니다.이러한 열의 수는 정적인 것이 아니라 이전 함수에 따라 달라집니다.
내가 어떻게 그럴 수 있을까?
이를 위한 한 가지 방법은 다음과 같습니다.
df = df[df.columns.drop(list(df.filter(regex='Test')))]
더 저렴하고, 더 빠르고, 실용적인:str.contains
최근 버전의 팬더에서는 인덱스와 열에 문자열 메서드를 사용할 수 있습니다.여기, 잘 맞는 것 같네요.
주어진 부분 문자열로 시작하는 모든 열을 제거하려면:
df.columns.str.startswith('Test')
# array([ True, False, False, False])
df.loc[:,~df.columns.str.startswith('Test')]
toto test2 riri
0 x x x
1 x x x
대/소문자를 구분하지 않는 일치의 경우 regex 기반 일치를 사용할 수 있습니다.str.contains
SOL 앵커를 사용합니다.
df.columns.str.contains('^test', case=False)
# array([ True, False, True, False])
df.loc[:,~df.columns.str.contains('^test', case=False)]
toto riri
0 x x
1 x x
혼합 유형이 가능한 경우 지정합니다.na=False
뿐만 아니라.
import pandas as pd
import numpy as np
array=np.random.random((2,4))
df=pd.DataFrame(array, columns=('Test1', 'toto', 'test2', 'riri'))
print df
Test1 toto test2 riri
0 0.923249 0.572528 0.845464 0.144891
1 0.020438 0.332540 0.144455 0.741412
cols = [c for c in df.columns if c.lower()[:4] != 'test']
df=df[cols]
print df
toto riri
0 0.572528 0.144891
1 0.332540 0.741412
이 작업은 다음과 같이 한 줄로 깔끔하게 수행할 수 있습니다.
df = df.drop(df.filter(regex='Test').columns, axis=1)
'filter'를 사용하여 원하는 열을 필터링할 수 있습니다.
import pandas as pd
import numpy as np
data2 = [{'test2': 1, 'result1': 2}, {'test': 5, 'result34': 10, 'c': 20}]
df = pd.DataFrame(data2)
df
c result1 result34 test test2
0 NaN 2.0 NaN NaN 1.0
1 20.0 NaN 10.0 5.0 NaN
나우 필터
df.filter(like='result',axis=1)
어서..
result1 result34
0 2.0 NaN
1 NaN 10.0
regex를 사용하여 원하지 않는 단어를 포함하지 않는 모든 열을 일치시키는 방법:
df = df.filter(regex='^((?!badword).)*$')
사용.DataFrame.select
방법:
In [38]: df = DataFrame({'Test1': randn(10), 'Test2': randn(10), 'awesome': randn(10)})
In [39]: df.select(lambda x: not re.search('Test\d+', x), axis=1)
Out[39]:
awesome
0 1.215
1 1.247
2 0.142
3 0.169
4 0.137
5 -0.971
6 0.736
7 0.214
8 0.111
9 -0.214
이 방법은 모든 것을 제자리에서 합니다.다른 답변들 중 많은 부분은 복사본을 만들고 효율적이지 못합니다.
df.drop(df.columns[df.columns.str.contains('Test')], axis=1, inplace=True)
질문에는 '테스트'라는 단어가 포함된 이름의 모든 열을 삭제하고 싶습니다.'라고 나와 있습니다.
test_columns = [col for col in df if 'Test' in col]
df.drop(columns=test_columns, inplace=True)
사용가능df.filter
문자열과 일치하는 열 목록을 가져온 다음 사용하려면 다음과 같이 하십시오.df.drop
resdf = df.drop(df.filter(like='Test',axis=1).columns.to_list(), axis=1)
정규식이 포함된 열 이름 목록을 삭제할 때의 해결 방법.저는 드롭 리스트를 자주 편집하기 때문에 이 방법을 선호합니다.드롭 목록에 음의 필터 정규 변수를 사용합니다.
drop_column_names = ['A','B.+','C.*']
drop_columns_regex = '^(?!(?:'+'|'.join(drop_column_names)+')$)'
print('Dropping columns:',', '.join([c for c in df.columns if re.search(drop_columns_regex,c)]))
df = df.filter(regex=drop_columns_regex,axis=1)
@cs95가 선호하는 답변을 기반으로 구축, 결합loc
람다 기능을 통해 다음과 같은 깨끗한 파이프 체인을 구현할 수 있습니다.
output_df = (
input_df
.stuff
.more_stuff
.yet_more_stuff
.loc[:, lambda x: ~x.columns.str.startswith('Test')]
)
이렇게 하면 다음과 같이 생성되는 데이터 프레임의 열을 참조할 수 있습니다.pd.DataFrame.yet_more_stuff
, 원래 데이터 프레임이 아닌input_df
열이 바뀌었을 수도 있기 때문에(물론 모든 것에 대해) 그 자체입니다.
언급URL : https://stackoverflow.com/questions/19071199/drop-columns-whose-name-contains-a-specific-string-from-pandas-dataframe
'programing' 카테고리의 다른 글
자바스크립트에서 동적 게터/세터를 구현할 수 있습니까? (0) | 2023.10.20 |
---|---|
수행 표시줄의 텍스트를 변경하는 방법 (0) | 2023.10.20 |
함수 이름을 문자열로 가져옵니다. (0) | 2023.10.15 |
기존 SQLite 테이블에 외부 키를 추가하려면 어떻게 해야 합니까? (0) | 2023.10.15 |
태그가 필요한 항목에 대한 워드프레스 위젯 업데이트 인스턴스 (0) | 2023.10.15 |