2014-06-10 1 views
2

동일한 파라미터를 참조하지만 길이가 다른 두 개의 개별 DataFrame 열에 시계열 데이터가 있습니다.두 데이터 프레임 열의 데이터를 하나의 열로 결합

데이터가 한 열에 만 존재하는 날짜에이 값을 새 열에 넣길 바랍니다. 양쪽 열에 대한 항목이있는 날짜에는 평균값을 갖고 싶습니다. (datetime 값인 인덱스를 사용하여 가입하고 싶습니다.)

누군가 내 두 열을 결합 할 수있는 방법을 제안 할 수 있습니까? 감사.

편집 2 : 두 열의 데이터를 병합해야하는 코드를 작성했지만 첫 번째 df에 값이 있지만 두 번째 df가있는 행에서 생성 된 색인을 사용하여 새 값을 설정하려고하면 KeyError이 표시됩니다. 하지 않습니다.

def merge_func(df): 
    null_index = df[(df['DOC_mg/L'].isnull() == False) & (df['TOC_mg/L'].isnull() == True)].index 
    df['TOC_mg/L'][null_index] = df[null_index]['DOC_mg/L'] 
    notnull_index = df[(df['DOC_mg/L'].isnull() == True) & (df['TOC_mg/L'].isnull() == False)].index 
    df['DOC_mg/L'][notnull_index] = df[notnull_index]['TOC_mg/L'] 

    df.insert(len(df.columns), 'Mean_mg/L', 0.0) 
    df['Mean_mg/L'] = (df['DOC_mg/L'] + df['TOC_mg/L'])/2 
    return df 

merge_func(sve) 

을 그리고 여기 오류입니다 : 여기 코드는 당신이 가까운

KeyError: "['2004-01-14T01:00:00.000000000+0100' '2004-03-04T01:00:00.000000000+0100'\n '2004-03-30T02:00:00.000000000+0200' '2004-04-12T02:00:00.000000000+0200'\n '2004-04-15T02:00:00.000000000+0200' '2004-04-17T02:00:00.000000000+0200'\n '2004-04-19T02:00:00.000000000+0200' '2004-04-20T02:00:00.000000000+0200'\n '2004-04-22T02:00:00.000000000+0200' '2004-04-26T02:00:00.000000000+0200'\n '2004-04-28T02:00:00.000000000+0200' '2004-04-30T02:00:00.000000000+0200'\n '2004-05-05T02:00:00.000000000+0200' '2004-05-07T02:00:00.000000000+0200'\n '2004-05-10T02:00:00.000000000+0200' '2004-05-13T02:00:00.000000000+0200'\n '2004-05-17T02:00:00.000000000+0200' '2004-05-20T02:00:00.000000000+0200'\n '2004-05-24T02:00:00.000000000+0200' '2004-05-28T02:00:00.000000000+0200'\n '2004-06-04T02:00:00.000000000+0200' '2004-06-10T02:00:00.000000000+0200'\n '2004-08-27T02:00:00.000000000+0200' '2004-10-06T02:00:00.000000000+0200'\n '2004-11-02T01:00:00.000000000+0100' '2004-12-08T01:00:00.000000000+0100'\n '2011-02-21T01:00:00.000000000+0100' '2011-03-21T01:00:00.000000000+0100'\n '2011-04-04T02:00:00.000000000+0200' '2011-04-11T02:00:00.000000000+0200'\n '2011-04-14T02:00:00.000000000+0200' '2011-04-18T02:00:00.000000000+0200'\n '2011-04-21T02:00:00.000000000+0200' '2011-04-25T02:00:00.000000000+0200'\n '2011-05-02T02:00:00.000000000+0200' '2011-05-09T02:00:00.000000000+0200'\n '2011-05-23T02:00:00.000000000+0200' '2011-06-07T02:00:00.000000000+0200'\n '2011-06-21T02:00:00.000000000+0200' '2011-07-04T02:00:00.000000000+0200'\n '2011-07-18T02:00:00.000000000+0200' '2011-08-31T02:00:00.000000000+0200'\n '2011-09-13T02:00:00.000000000+0200' '2011-09-28T02:00:00.000000000+0200'\n '2011-10-10T02:00:00.000000000+0200' '2011-10-25T02:00:00.000000000+0200'\n '2011-11-08T01:00:00.000000000+0100' '2011-11-28T01:00:00.000000000+0100'\n '2011-12-20T01:00:00.000000000+0100' '2012-01-19T01:00:00.000000000+0100'\n '2012-02-14T01:00:00.000000000+0100' '2012-03-13T01:00:00.000000000+0100'\n '2012-03-27T02:00:00.000000000+0200' '2012-04-02T02:00:00.000000000+0200'\n '2012-04-10T02:00:00.000000000+0200' '2012-04-17T02:00:00.000000000+0200'\n '2012-04-26T02:00:00.000000000+0200' '2012-04-30T02:00:00.000000000+0200'\n '2012-05-03T02:00:00.000000000+0200' '2012-05-07T02:00:00.000000000+0200'\n '2012-05-10T02:00:00.000000000+0200' '2012-05-14T02:00:00.000000000+0200'\n '2012-05-22T02:00:00.000000000+0200' '2012-06-05T02:00:00.000000000+0200'\n '2012-06-19T02:00:00.000000000+0200' '2012-07-03T02:00:00.000000000+0200'\n '2012-07-17T02:00:00.000000000+0200' '2012-07-31T02:00:00.000000000+0200'\n '2012-08-14T02:00:00.000000000+0200' '2012-08-28T02:00:00.000000000+0200'\n '2012-09-11T02:00:00.000000000+0200' '2012-09-25T02:00:00.000000000+0200'\n '2012-10-10T02:00:00.000000000+0200' '2012-10-24T02:00:00.000000000+0200'\n '2012-11-21T01:00:00.000000000+0100' '2012-12-18T01:00:00.000000000+0100'] not in index" 
+0

[유사한 이름의 열의 경우 접미사를 추가해야하는 경우를 대비하여]이 답변을 살펴보십시오. "http://stackoverflow.com/questions/23906835/pandas-merging-join-dataframes/23921662#23921662" 이제 여기에서 읽어보십시오. "http://pandas.pydata.org/pandas-docs/stable/indexing.html?highlight=loc#indexing-and-selecting-data"특정 색인을 선택하는 방법을 알아내는 방법. 병합 후에 수행 할 작업은 df [(df [ 'colA'] .isnull() == True) 및 (df [ 'colB']의 변형을 사용하여 값이 누락 된 행을 찾습니다. = False)], 누락 된 경우 값을 설정하십시오. 그런 다음 colA와 colB에서 평균을 취하십시오. –

+0

의견을 보내 주셔서 감사합니다. @ RyanG. 내 열은 이미 동일한'DataFrame'에 있고 색인 (날짜 시간 임)을 공유합니다. 두 행에 값이 포함되어 있으면 빈 행을 찾거나 평균을 취하는 함수를 작성했지만 새로운 값을 할당하려고하면 구문 오류가 발생합니다.원래 질문에 새 코드를 추가했습니다. – Bprodz

+0

루프가 완료된 후 데이터 프레임을 반환합니다. 귀하의 구현이 마무리되었지만 아래의 답변에서이 문제를 해결할 수있는 또 다른 방법이 있습니다. –

답변

2

,하지만 당신은 실제로() 함수 ISNULL을 사용하는 경우 행을 반복 할 필요가 없습니다. 기본적으로

df[(df['DOC_mg/L'].isnull() == False) & (df['TOC_mg/L'].isnull() == True)].index 

DOC_mg/L가 null는 아니고, TOC_mg/L가 null 행의 바로 인덱스를 반환합니다.

이제 TOC_mg/L의 값을 설정하려면이 같은 작업을 수행 할 수 있습니다

null_index = df[(df['DOC_mg/L'].isnull() == False) & \ 
       (df['TOC_mg/L'].isnull() == True)].index 
df['TOC_mg/L'][null_index] = df['DOC_mg/L'][null_index] # EDIT To switch the index position. 

이 TOC_mg/L가 null DOC_mg/L가 null가 아닌 행의 인덱스를 사용합니다 TOC_mg/L의 값을 같은 행의 DOC_mg/L에있는 값으로 설정하십시오.

참고 :이 인덱스를 사용하여 값을 설정하기위한 허용 방법이 아니다, 그러나 나는 몇 시간 동안 그 일을 봤는데 방법이다. 값을 설정할 때 방정식의 왼쪽이 df['col_name'][index]인지 확인하십시오. col_nameindex이 전환 된 경우 값을 원래대로 설정되지 않은 사본으로 설정합니다.

평균을 설정하려면 새 열을 만들 수 있습니다.이 값은 Mean_mg/L이고 값은 0.0입니다. 이어서 두 열의 평균이 새로운 열 세트 : 우리는 해당 열의 값 NULL 값 채워진 열

# Insert a new col at the end of the dataframe columns name 'Mean_mg/L' 
#  with default value 0.0 
df.insert(len(df.columns), 'Mean_mg/L', 0.0) 
# Set this columns value to the average of DOC_mg/L and TOC_mg/L 
df['Mean_mg/L'] = (df['DOC_mg/L'] + df['TOC_mg/L'])/2 

는 평균 값과 동일한 것이다.

+0

해결책 주셔서 감사합니다. 나는 두 번째'df'에서 첫 번째로 값을 복사하기 위해 여분의 라인을 추가했다. 평균을 계산하기 전에'Pandas'가 평균을 계산할 때 NaN을 건너 뛸지 확신하지 못했다. 나는'null_index'가'not in index'라는'KeyError'를 얻습니다. 색인을 생성하는 데 사용 된'df '가 적용 대상과 동일하므로 왜이 오류가 발생하는지 이해할 수 없습니다. 나는 그 잘못을 잘못 이해 했는가? – Bprodz

+1

Mhmm. 인덱스가 어떻게 설정되어 있는지에 따라 df [null_index] [ 'DOC_mg/L']'를 사용할 수없고'df [ 'DOC_mg/L'] [null_index]'를 대신 사용할 수 있습니다. 이것은 이전에 일어난 적이 없었기 때문에 흥미 롭습니다 만, 운이 좋았을 것입니다. 수정 사항을 포함하도록 게시물을 업데이트했습니다. –

+1

고마워요. 나는 또한 .loc을 사용하는 대안 솔루션을 찾았습니다. 즉, df.loc [null_index, 'TOC_mg/L'] = df [ 'DOC_mg/L']' – Bprodz

관련 문제