2017-10-02 4 views
0

내가하려고하는 것은 Excel 파일 (팬더 포함)의 여러 행을 삭제 한 다음 해당 행이없는 파일을 .xlsx로 저장하는 것입니다. (pyexcelerate 모듈 포함).값 집합에없는 행 찾기 (SQL Except와 유사)

데이터 프레임의 행을 삭제하여 삭제할 수 있다는 것을 알고 있습니다. 이미 작동하도록했습니다. 하지만 여러 게시물을 읽었을 때 많은 경우 (내 경우에는> 5000) 행을 삭제해야합니다. 데이터 프레임에서 "삭제"행의 인덱스를 얻은 다음 데이터 프레임을 슬라이스하는 것이 훨씬 빠릅니다 예를 들어 SQL Except 문과 같이). 불행히도 나는 여러 가지 방법을 시도해 보았지만 제대로 작동하지 않습니다. 여기

내 "원본 게시물"입니다

Slice Pandas dataframe by labels that are not in a list -

How to drop a list of rows from Pandas dataframe? 사용자 ASGM에서 대답 - 여기에 대답 사용자에서 데니스 Golomazov

그리고 함수의 일부, 즉 삭제해야 행을 만들고 만들어진 파일을 저장하십시오.

for index, cell in enumerate(wb_in[header_xlsx]): 
    if str(cell) in delete_set: 
     set_to_delete.append(index) 
     print str(cell) + " deleted from set: " + str(len(set_to_delete)) 
wb_out = Workbook() 
data_out = wb_in.loc[set(wb_in.index) - set(set_to_delete)] 
ws_out = wb_out.new_sheet('Main', data=data_out) 
wb_out.save(file_path + filename + "_2.xlsx") 

다음은 데이터 프레임의 예입니다.

   sku product_group      name \ 
0 ABCDb00610-23.0   ABA1  Anti 
1 ABCDb00610-10.0   ABA1  Anti 
2 ABCDb00610-1.1   ABA1   Anti 
3 ABCDb00609-23.0   ABA1   Anti 
4 ABCDb00609-10.0   ABA1   Anti 
5 ABCDb00609-1.1   ABA1   Anti 
6 ABCDb00608-23.0   ABA1   Anti 
7 ABCDb00608-10.0   ABA1   Anti 
8 ABCDb00608-3.3   ABA1   Anti 
9 ABCDb00608-3.0   ABA1   Anti 

Delete_set은 skus (예 : ABCDb00608-3.3 또는 ABCDb00609-1.1) 만 포함하는 집합입니다.

Btw : 많은 솔루션 제안을 시도했습니다!

미리 감사드립니다.

+0

두 가지를 제시해주십시오 : 1. dataframe 2. "delete_set". 세트에는 무엇이 들어 있습니까? 색인? 가치? 이것은 분명하거나 도움이되지 않습니다. –

+0

데이터 프레임에는 3 개의 열이 있습니다. sku | product_group | 이름. 그리고 'set_to_delete'에는 for 루프에서 찾은 색인이 들어 있습니다. – Frame

+1

내 질문에 완전히 대답하지 않았습니다. 실제 데이터를 텍스트 형식으로 보는 것이 좋을 것입니다. –

답변

1

사용 pd.Series.isin :

df = df[~df.sku.isin(delete_set)] 

print(df) 
       sku product_group     name 
0 ABAAb00610-23.0   ABA1 Anti-Involucrin [SY5] 
1 ABAAb00610-10.0   ABA1 Anti-Involucrin [SY5] 
2 ABAAb00610-1.1   ABA1  Anti-EpCAM [AUA1] 
3 ABAAb00609-23.0   ABA1  Anti-EpCAM [AUA1] 
4 ABAAb00609-10.0   ABA1  Anti-EpCAM [AUA1] 
5 ABAAb00609-1.1   ABA1  Anti-EpCAM [AUA1] 
6 ABAAb00608-23.0   ABA1  Anti-EpCAM [AUA1] 
7 ABAAb00608-10.0   ABA1  Anti-EpCAM [AUA1] 
8 ABAAb00608-3.3   ABA1  Anti-EpCAM [AUA1] 
9 ABAAb00608-3.0   ABA1  Anti-EpCAM [AUA1] 

print(delete_set) 
('ABAAb00608-3.3', 'ABAAb00609-1.1') 

m = ~df.sku.isin(delete_set) 
print(m) 
0  True 
1  True 
2  True 
3  True 
4  True 
5 False 
6  True 
7  True 
8 False 
9  True 
Name: sku, dtype: bool 

print(df[m]) 
       sku product_group     name 
0 ABAAb00610-23.0   ABA1 Anti-Involucrin [SY5] 
1 ABAAb00610-10.0   ABA1 Anti-Involucrin [SY5] 
2 ABAAb00610-1.1   ABA1  Anti-EpCAM [AUA1] 
3 ABAAb00609-23.0   ABA1  Anti-EpCAM [AUA1] 
4 ABAAb00609-10.0   ABA1  Anti-EpCAM [AUA1] 
6 ABAAb00608-23.0   ABA1  Anti-EpCAM [AUA1] 
7 ABAAb00608-10.0   ABA1  Anti-EpCAM [AUA1] 
9 ABAAb00608-3.0   ABA1  Anti-EpCAM [AUA1] 
+0

이것은 내 출력 파일입니다. https://ufile.io/sqn3b (.xlsx - no macros!). 하나의 열에 각 문자가있는 제목 만 포함합니다. 문제가 무엇인지 모르겠다 – Frame

+0

'df.to_excel ('out.xlsx', sheet_name = 'Sheet1')'을 사용하십시오. 직접 쓰지 마십시오. –

+0

pandas .to_excel 함수는 내 데이터를 파일에 쓸 때 수세기가 걸립니다. 그래서 필자는 pyexcelerate를 사용하여 파일에 쓰기로 결정했습니다. 그리고 지금까지 (행을 떨어 뜨리지 않기 전까지) 완벽하게 작동했습니다. 그 차이점을 설명해 주시겠습니까? – Frame