2017-11-01 8 views
1

첫 번째 열에 날짜가 들어있는 CSV 파일/pandas 데이터 프레임을 처리하고 있습니다. 여기 datetime, 일부 필터링, 정렬 및 다시 색인화에 대한 일부 변환을 수행하려고합니다.두 작업 집합간에 순서가 불변하지 않은 이유는 무엇입니까?

내가 경험 한 것은 작업 집합의 순서를 변경하면 다른 결과를 얻게된다는 것입니다. 첫 번째 구성 결과가 다른 결과보다 큽니다. 아마 첫 번째 것이 "좋은"것입니다.

아무도 말해 줄 수있는 하위 작업 결과의 차이가 발생합니까?

"나쁜"과 "좋은"해결책은 무엇입니까?

사용자가 임의의 순서로 두 메서드를 호출 할 수 있고 여전히 양호한 결과를 얻을 수있는 안전한 순서 독립이 가능합니까? (가능 작업 교체 세트를 구현함으로써 좋은 결과를 얻을 수는?)

jdf1 = x.copy(deep=True) 
jdf2 = x.copy(deep=True) 
interval = [DATE_START, DATE_END] 
dateColName = "Date" 

구성 1 :

# Operation set 1: dropping duplicates, sorting and reindexing the table 
jdf1.drop_duplicates(subset=dateColName, inplace=True) 
jdf1.sort_values(dateColName, inplace=True) 
jdf1.reset_index(drop=True, inplace=True) 

# Operatrion set 2: converting column type and filtering the rows in case of CSV's contents are covering a wider interval 
jdf1[dateColName] = pd.to_datetime(jdf1[jdf1.columns[0]], format="%Y-%m-%d") 
maskL = jdf1[dateColName] < interval[0] 
maskR = jdf1[dateColName] > interval[1] 
mask = maskL | maskR 
jdf1.drop(jdf1[mask].index, inplace=True) 

구성 2

# Operatrion set 2: converting column type and filtering the rows in case of CSV's contents are covering a wider interval 
jdf2[dateColName] = pd.to_datetime(jdf2[jdf2.columns[0]], format="%Y-%m-%d") 
maskL = jdf2[dateColName] < interval[0] 
maskR = jdf2[dateColName] > interval[1] 
mask = maskL | maskR 
jdf2.drop(jdf2[mask].index, inplace=True) 

# Operation set 1: dropping duplicates, sorting and reindexing the table 
jdf2.drop_duplicates(subset=dateColName, inplace=True) 
jdf2.sort_values(dateColName, inplace=True) 
jdf2.reset_index(drop=True, inplace=True) 

결과 :

val1 = set(jdf1["Date"].values) 
val2 = set(jdf2["Date"].values) 

# bigger: 
val1 - val2 

# empty: 
val2 - val1 

도움 주셔서 감사합니다.

+0

일부 데이터를 제공해 주시겠습니까? 'df.to_json()'의 출력이며, 문제를 재현하기에 충분히 작은 샘플이 바람직합니다. –

+0

더 큰 (사전 처리 된) 데이터 세트에서이 문제가 발생했습니다. 문제를 소규모로 다시 작성하거나 환경에서 데이터를 얻는 것은 쉽지 않습니다. 데이터 형식을 다음과 같이 변경합니다 ('% d- % b- % y'). http://finance.google.ca/finance/historical?q=AAN&startdate=01+01 +2016 & enddate = 01 + 01 + 2017 & output = csv – user1802693

답변

1

처음 보면 똑같지 만 보이지는 않습니다. -

boolean indexing with mask -> remove K rows, together ALL rows - K 
drop_duplicates() -> remove L rows, together ALL - K - L 
K != M 
L != N 

그리고 스왑이 작업을하는 경우, 결과가 있기 때문에, 달라야한다

drop_duplicates() -> remove M rows, together ALL rows - M 
boolean indexing with mask -> remove N rows, together ALL - M - N 

:

으로 필터링하는 2 개 가지 방법이 있기 때문에

는 서로 영향을 미치는 둘 다 행을 제거합니다. 일부 행에서는 drop_duplicates 만 제거하고, 부울은 부울 인덱스 만 제거하기 때문에 호출하는 것이 중요합니다.

내 의견으로는 두 가지 방법 모두 옳다. 필요에 따라 달라진다.

+0

OP는 값 목록을보고 중복을 삭제하고 일정 기간 내에있는 값을 유지합니다. 작업 순서가 결과에 어떤 영향을 미치는지 예를 들려 줄 수 있습니까? –

+1

내가 처음 라인을 잘못 생각한 것 같습니다 : drop_duplicates() -> M 행을 모두 제거 - 모든 행 - M – user1802693

+1

맞습니다, typo – jezrael