2016-08-04 6 views
1

나는 csv 파일을 읽고이 파일을 pandas 데이터 프레임에 저장하려고합니다. 그 후 하나의 열 값이 상수 변수와 같고 동등한 행이 별도의 데이터 프레임에 보관되어야하는지 확인하고 싶습니다.파이썬에서 팬더 데이터 프레임의 특정 열에있는 모든 행을 업데이트하는 방법은 무엇입니까?

다음 단계는 별도의 데이터 프레임에서 하나의 열을 업데이트하는 것입니다. 이 단계에서는 전체 데이터 프레임을 반복하고 특정 열의 모든 행을 업데이트하므로 데이터 프레임에 수천 개의 행이 있으므로 너무 많은 시간이 걸립니다.

Input.csv-

line_no,time 
205,1467099122677889 
205,1467099122677889 
206,1467099363719028 
207,1467099363818373 
207,1467099363918360 
208,1467099363818373 
210,1467099363958749 

프로그램 -

import pandas as pd 

if __name__ == "__main__": 

    file_path = 'Input.csv' 
    input_line_no = 205 

    pd_dataframe = pd.read_csv(file_path,delimiter=',',keep_default_na=False) 
    match_df = pd.DataFrame(pd_dataframe.loc[pd_dataframe['line_no'] == int(input_line_no)]) 

    if match_df.empty: 
     print 'Given line no is not present in dataframe.' 
     sys.exit(1) 
    match_df = match_df.applymap(str) 
    for index in range(0,len(match_df.index)): 

     epoch_time = match_df.iloc[index]['time'] 
     stamp = int(str(epoch_time)+'0') 
     date = datetime.datetime.fromtimestamp(stamp/10000000.0).strftime('%H:%M:%S %f')[:-3] 
     match_df['time'].apply(str) 
     match_df.iloc[index]['time'] = date 

    print match_df.to_csv(index=False) 

이 시간 열은 논리가 그것을 위해 그래서 나는 사람이 읽을 수있는 타임 스탬프로 변환 할 시대 시간에 목적 만.

하지만이 작업과 관련된 실행 시간 문제가 있습니다. 더 빠른 방법으로 기존 데이터 프레임의 열을 업데이트하는 다른 방법이 있습니까?

+0

사용'날짜 = datetime.datetime.fromtimestamp가 (스탬프/10000000.0)'는'2434년 11월 27일 04 반환하는 경우 : 20 : 26.778889'합니다. 맞아? 아니면'2016-06-28 07 : 32 : 02'입니까? – jezrael

+0

@jezrael - 예 맞습니다. 걱정하지 마십시오. 데이터 프레임의이 업데이트 칼럼의 실행 시간을 어떻게 줄일 수 있습니까? – kit

답변

1

IIUC 먼저 사용할 수 있습니다

match_df = pd_dataframe[pd_dataframe['line_no'] == int(input_line_no)].copy() 
print (match_df) 
    line_no    time 
0  205 1467099122677889 
1  205 1467099122677889 

당신은 apply를 사용할 수 timestamp limitations 이유는

에서

[55] : pd.Timestamp.max
아웃 [55] : 타임 스탬프 ('2262년 4월 11일 23 : 47 : 16.854775807')

match_df['time'] = match_df.time 
          .apply(lambda x: datetime.datetime.fromtimestamp(int(str(x)+'0') 
           /10000000.0)) 
print (match_df) 
    line_no      time 
0  205 2016-06-28 09:32:02.677889 
1  205 2016-06-28 09:32:02.677889 

: 그리고

match_df['time'] = match_df.time 
          .apply(lambda x: datetime.datetime.fromtimestamp(int(str(x)+'0') 
           /10000000.0).strftime('%H:%M:%S %f')[:-3]) 
print (match_df) 
    line_no   time 
0  205 09:32:02 677 
1  205 09:32:02 677 
+0

죄송합니다, epoch_time을 datetime으로 변환하는 것이 확실하지 않습니다. 출력이 맞습니까? – jezrael

+0

@ jezrael-이 스크립트는 올바른 행의 시간을 올바른 위치에 삽입하고 있습니까? csv 파일에서 모든 시간이 같지 않으므로 특정 행의 시간을 사람이 읽을 수있는 타임 스탬프로 변경하고 해당 위치에만 배치해야합니다. – kit

+0

에포크를 인간이 읽을 수있는 타임 스탬프로 변환하기위한 몇 가지 요구 사항 때문에 내 로직이 좋다. 그래서 코드에서 인간 타임 스탬프로 변환하는 논리를 적용 할 수 있을까? 그렇다면 어떻게? – kit

관련 문제