2017-10-12 14 views
0

약 3500 개의 레코드가있는 테이블이 있습니다.Python은 중복 시간을 기준으로 데이터를 병합하고 병합합니다.

루프를 통해 각 레코드의 2, 3, 4 일 수있는 UNIQUEID라는 필드를 기반으로 중복 된 레코드를 찾으려고합니다. 내 최종 목표는 동일 UNIQUEID 값이 레코드를 병합하는 것이지만, 다른 RTYPE 내가 내 중복을 발견 할 때, 내가 RTYPE을 확인하려면 지금

OID UNIQUEID  RTYPE  TIME  OTHER 
1 ABC_20170215  SENT  12:30  item1 
2 ABC_20170215 RECEIVED 12:29  
3 ABC_20170215  SENT  12:35  item4 

값과 RTYPE이 다른 경우, 다음 알아 내기 위해 수학을하는 하나는 시간에 가장 가깝고 그 두 개를 병합합니다.

위의 표에서 레코드 1과 2가 병합되며 RTYPE 또는 TIME과 같은 열은 신경 쓰지 않지만 데이터가 있으면 OTHER와 같은 열을 유지하려고합니다.

그래서 지금까지 중복 코드를 찾고있는 코드를 생각해 봅니다.이 코드는 여러개의 문제점을 가지고 있습니다.

###set up cursors 
cursor1 = arcpy.da.SearchCursor(shp, ["UNIQUEID", "RTYPE"]) 
cursor2 = arcpy.da.SearchCursor(shp, ["UNIQUEID", "RTYPE"]) 
count = 0 
#make a dictionary and store values from my table 
idUnique = {} 
for row in cursor1: 
    idUnique[row[0]] = row[0] 
    idUnique[row[1]] = row[1] 

#loop through other table 
for row in cursor2: 
    if row[0] == idUnique[row[0]]: 
     print "Row 1 {}".format(row[0]) + " --{}".format(row[1]) 
     print "ID Row 1 {}".format(idUnique[row[0]]) + " --{}".format(idUnique[row[1]]) 

도움이 될 것입니다!

내 예상 출력 내가 사전에 데이터를 얻기 위해, 단 하나의 커서를 만드는 것이 좋습니다

OID UNIQUEID  RTYPE   TIME   OTHER 
1 ABC_20170215 <whatever> <whatever>   item1 
3 ABC_20170215 <whatever> <whatever>   item4 
+0

예상 출력을 표시 할 수 있습니까? – akilat90

+1

은'df.groupby()'가 도움이 될 것입니다! – ileadall42

+0

어떤 오류 또는 잘못된 출력이 나옵니까? – Erica

답변

0

, 그리고 다음 거기에서 데이터를 조작에 작동합니다. 어쨌든 사전을 만들어야하므로은 다음 루프에 대한 정보를 저장하기 때문에 사전을 사용할 수도 있습니다. 당신이 중복을 찾을 특성을 비교하기 위해 사전을 겪고 시작할 수 있습니다,이 시점에서

unique_ids = [] 
all_data = {} 
cursor = arcpy.da.SearchCursor(shp, ["FID", "UNIQUEID", "RTYPE", "TIME", "OTHER"]) 
for row in cursor: 
    if row[1] not in unique_ids: 
     unique_ids.append(row[1]) 
    all_data[row[0]] = { 
     "uniqueid": row[1], 
     "rtype": row[2], 
     "time": row[3], 
     "other": row[4] 
    } 

(나는는. 다른 기능 클래스를 통해 루프에 갈 경우에만 두 번째 커서를 추천 할 것입니다 ), 및 무엇을 지키고 무엇을 버릴 지 결정하십시오.

+0

내 주요 문제는 2 개 이상의 중복이있을 수 있다고 생각합니다. 시간과 시간의 차이가있는 동일한 레코드 4 개가있을 수 있습니다. 시간의 가장 작은 차이를 기반으로 쿼리하고 병합해야합니다. 팬더가 가장 잘 작동한다고 생각합니다. 어떤 방식 으로든 사용하지 않았습니다. – KRL

+0

SearchCursor를 사용하여 사전을 가져 왔으면 팬더에 들어갈 수 있습니다. 그것은 내 전문 분야 외에 더 깊다. :) – Erica