df.drop이 있는 경우
아래는 파일을 가져와서 열 이름을 드롭하는 함수입니다.row_num
,start_date
,end_date
.
문제는 모든 파일에 이러한 각 열 이름이 있는 것은 아니므로 함수가 오류를 반환한다는 것입니다.
제 목표는 이러한 열이 존재하면 제거하고 특정 열이 존재하지 않으면 오류를 반환하지 않도록 코드를 변경하는 것입니다.
def read_df(file):
df = pd.read_csv(file, na_values=['', ' '])
# Drop useless junk and fill empty values with zero
df = df.drop(['row_num','start_date','end_date','symbol'], axis=1).fillna(0)
df=df[df!=0][:-1].dropna().append(df.iloc[-1])
return df
매개변수 추가errors
다음으로:
오류: {'ignore', 'raise', 기본값 'raise'
'무시'인 경우 오류를 억제하고 기존 레이블만 삭제합니다.
df = df.drop(['row_num','start_date','end_date','symbol'], axis=1, errors='ignore')
샘플:
df = pd.DataFrame({'row_num':[1,2], 'w':[3,4]})
df = df.drop(['row_num','start_date','end_date','symbol'], axis=1, errors='ignore')
print (df)
w
0 3
1 4
팬더 필터, 파이토닉 웨이만 사용하면 됩니다.
이상하게도, 어떤 대답도 사용하지 않습니다.pandas
데이터 프레임filter method
thisFilter = df.filter(drop_list)
df.drop(thisFilter, inplace=True, axis=1)
이렇게 하면 에서 필터가 생성됩니다.drop_list
에 존재하는df
, 그다음에 떨어뜨리세요thisFilter
로부터df
inplace
위에axis=1
즉, 다음과 일치하는 열을 떨어뜨립니다.drop_list
존재하지 않더라도 오류를 범하지 마십시오.
제 시험에서 다음은 적어도 주어진 답만큼 빨랐습니다.
candidates=['row_num','start_date','end_date','symbol']
df = df.drop([x for x in candidates if x in df.columns], axis=1)
가독성과 (코드를 조금만 수정하면) 정확하게 어떤 열이 존재하는지를 기록할 수 있다는 장점이 있습니다.
이전 솔루션보다 이것이 더 바람직한 이유는 다음과 같습니다.
- 각 열이 있는 경우 항목을 반복적으로 표시하고 각 열을 개별적으로 삭제하는 것은 기능적이지만 매우 느립니다(아래 벤치마크 참조).
- jezrail의 답변은 매우 좋으나 처음에는 긴장하게 만들었습니다(ignoring 오류는 기분이 나쁩니다!).설명서를 좀 더 자세히 살펴보면, 이는 괜찮은 것처럼 들리며, 단순히 존재하지 않는 열의 오류를 무시할 뿐입니다(무시하고 싶지 않을 수 있는 다른 오류가 아님).내 해결책은 특히 팬더의 선택적인 쿼그에 익숙하지 않은 사람들에게 더 잘 읽힐 수 있습니다.
벤치마크 결과:
벤치마크 테스트를 위한 코드(이러한 종류의 벤치마크를 만드는 방법에 대한 이 질문의 답변에 대한 크레딧):
import math
from simple_benchmark import benchmark
import pandas as pd
# setting up the toy df:
def df_creator(length):
c1=list(range(0,10))
c2=list('a,b,c,d,e'.split(','))
c3=list(range(0,5))
c4=[True,False]
lists=[c1,c2,c3,c4]
df=pd.DataFrame()
count=0
for x in lists:
count+=1
df['col'+str(count)]=x*math.floor(length/len(x))
return df
# setting up benchmark test:
def list_comp(df,candidates=['col1','col2','col5','col8']):
return df.drop([x for x in candidates if x in df.columns], axis=1)
def looper(df,candidates=['col1','col2','col5','col8']):
for col in candidates:
if col in df.columns:
out = df.drop(columns=col, axis=1)
return out
def ignore_error(df,candidates=['col1','col2','col5','col8']):
return df.drop(candidates, axis=1, errors='ignore')
functions=[list_comp,looper,ignore_error]
args={n : df_creator(n) for n in [10,100,1000,10000,100000]}
argname='df_length'
b=benchmark(functions,args,argname)
b.plot()
사용하다df.columns.intersection
쾌속으로
df.columns.intersection
는 누락된 열을 제외하기 위해 내장된 메서드입니다.
existing_cols = df.columns.intersection(["foo", "bar", "baz"])
df = df.drop(columns=existing_cols)
누락된 열의 수가 증가하더라도 다음을 통해 드롭하는 속도가 매우 빠릅니다.
타이밍 데이터:
df = pd.DataFrame(np.random.random((10_000, 200)), columns=range(-200, 0))
cols = range(-100, n) # 100 dropped columns, n missing columns
저는 그냥 이렇게 해야만 했어요. 제가 한 일은 이렇습니다.
# Drop these columns if they exist
cols = ['Billing Address Street 1', 'Billing Address Street 2','Billing Company']
for col in cols:
if col in df.columns:
df = df.drop(columns=col, axis=1)
최선의 방법은 아닐 수도 있지만 목적에는 부합했습니다.
x = ['row_num','start_date','end_date','symbol']
열이 존재하는지 확인하려면 다음 작업을 수행할 수 있습니다.
for i in x:
if i in df:
df = df.drop(['row_num','start_date','end_date','symbol'], axis=1).fillna(0)
아니면
for i in x:
if i in df.columns:
df = df.drop(['row_num','start_date','end_date','symbol'], axis=1).fillna(0)
언급URL : https://stackoverflow.com/questions/59116716/df-drop-if-it-exists
'programing' 카테고리의 다른 글
워드프레스 웹사이트에 .exe 파일 업로드하기 (0) | 2023.09.25 |
---|---|
ORA-01722(잘못된 번호)가 표시되는 이유는 무엇입니까? (0) | 2023.09.25 |
jID에 대한 jQuery selector가 특정 텍스트로 시작합니다. (0) | 2023.09.25 |
Vim에서 HTML 태그를 빨리 닫을 수 있는 방법은 무엇입니까? (0) | 2023.09.25 |
정규식 \p{L} 및 \p{N} (0) | 2023.09.20 |