programing

이름에 panda DataFrame의 특정 문자열이 포함된 열을 삭제합니다.

cafebook 2023. 10. 20. 14:20
반응형

이름에 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.containsSOL 앵커를 사용합니다.

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

반응형