2014-07-25 4 views
0

데이터 프레임이 있고 주어진 열에서 일부 연산을 수행하고 새 열을 생성해야하는 경우 아래 함수보다 더 좋은 방법이 있습니까?팬더 작업을 사용하여 팬더 데이터 프레임에 열 추가

원본 열을 변경하고 싶지는 않습니다. 이 작업과 유사한 작업을 위해 새 열을 계속 추가하고 싶습니다.

하지만 아래 코드에는 너무 많은 행이있는 것 같습니다. 즉, 팬더의 rank() 함수는 매우 편리합니다. 데이터 프레임에 "어이, 이미 알고있는 함수를 적용해라."라고 말하면서 원래의 칼럼 자체를 수행하는 대신 끝에 칼럼을 새 컬럼으로 만든다. 데이터 프레임의 "

그런 방법이 있습니까? 아니면 아래의 코드를 좀 더 간결하고 우아하게 만들고 같은 결과를 얻을 수있는 방법이 있습니까? 나는 단지 장황한 것처럼 보인다. 나는 다른 일을 위해서도 이것을한다. cut() 함수와 동일한 유형의 함수가 있습니다. 나는 다른 몇 가지 작전을 위해 그것을 할 것입니다. 너무 일반적이어서 쉽게 보입니다.

감사합니다.

def rank(pdfAll, nOldColIndex, sNewColName, sMethod, bAsc): 
"""Appends a ranked column to a DataFrame based on an existing column. 

    nOldColIndex is the index of the column with the original data. 
    sNewColName is the name of the new column. 
    sMethod goes to the pandas rank function to influence ranking behavior. 
    bAsc goes to the pandas rank function to influence ranking behavior. 
    pdfAll[nOldColIndex] must have numeric contents. 

""" 

serOldCol = pdfAll.ix[:,nOldColIndex] 
serOldCol.name = sNewColName 

serNewCol = serOldCol.rank(method=sMethod, ascending=bAsc) 
pdfNewCol = pd.DataFrame(serNewCol) 

pdfAll = pd.merge(pdfAll, pdfNewCol, left_index=True, right_index=True) 

return pdfAll 
+0

샘플 데이터 프레임과이를 실행하는 명령을 제공 할 수 있습니까? – FooBar

+0

달성하고자하는 것을 정확하게 설명하십시오. 일반적으로 반복 형식을 피하고 계산을 벡터화 할 수있는 경우 apply를 사용하십시오. 그냥 새 열을 추가하는 것처럼 보입니다.이 경우 df [ 'new_col'] = some_calc_on_df를 수행하십시오. 동일한 인덱스를 가진 다른 데이터 프레임을 추가하고 추가 또는 연결을 사용하려면 순서가 다르며 일부 ID 열에 가입하려는 경우가 아니면 병합 할 필요가 없습니다. – EdChum

답변

2

나는이 일반화 모든 것 잘 모르겠지만, 당신이 뭔가를 수행하려는 경우, 기능을 일반화

df['newColumn'] = df.oldColumn.rank() 

으로 뭔가를하려고 혹시 당신을 행 단위로 수행 할 수 있습니다.

df.apply(lambda x: x.oldColumn * x.otherOldColumn, axis=1) 
+0

완전히 손톱! 무언가는 이것이 나의 장황한 혼란 대신에 하나의 튼튼한 라인에서 이루어질 수 있다고 말했다. 감사! –

관련 문제