2017-12-26 4 views
1

의 사용 :파이썬, 내가 코드 문 다음 한 람다

def gigajoule(row): 
row['Energy Supply'] *= 1000000 
return row 
energy = energy.apply(gigajoule, axis = 1) 

아마 람다 함수를 사용하여 간단하게 할 수있는 방법이 있어야합니다,하지만 난 그렇게하는 방법을 알아낼 수 없습니다.

+3

주면서 당신이 입력 변수를 변경할 수 있지만, (이 팬더입니다 가정하는 경우에 당신이 태그를해야하지 (쉽게) 할 적절하게) 행이 출력으로 바뀌기 때문에 부작용이 아닌 것처럼 보입니다. –

답변

2

예제 코드에서는 일반적인 사용 패턴과 다르게 df.apply을 사용하고 있습니다. 정상적인 사용법은 원본 데이터를 수정하지 않고 제공된 데이터에서 값의 새로운 행을 생성하는 것입니다 (.apply() documentation의 부작용에 대한 경고 참조). 또한 lambda 함수가 동작하는 방식이기도합니다. 즉, 한 줄 계산을 통해 새 값을 생성하지만 직접 할당을 수행 할 수는 없습니다. 그러나, 귀하의 경우에, 당신은 주어진 행을 수정하고 그것을 반환하고 있습니다.

코드가 예상 한 것과 다른 일을 할 수도 있습니다. 로우 리턴 어셈블

  1. gigajoule가 dataframe
  2. gigajoule에서 행을 수신하도록 변경하는 것이 가능한 원래 dataframe 자체
  3. gigajoule 수정받은 로우 리턴 개질 행
  4. 팬더 : 이는 다음을 수행 gigajoule으로 새 데이터 프레임에
  5. 기존 데이터 프레임을 새 데이터 프레임으로 바꿉니다.

2 단계는 꽤 비표준입니다 (원본 데이터 프레임을 apply 작업의 부작용으로 수정 함). 예를 들어, 다음 코드는 아마도 예기치 않게, 원래 energy 프레임을 변경합니다

import pandas as pd 
energy = pd.DataFrame({'Energy Supply': [100, 200, 300], 'Temperature': [201, 202, 203]}) 
def gigajoule(row): 
    row['Energy Supply'] *= 1000000 
    return row 
energy2 = energy.apply(gigajoule, axis = 1) 
energy # has been modified! 

또한 표준이 아닌 방법으로 원래의 프레임을 변경 같은 람다,와 같은 패턴을 사용할 수

import pandas as pd 
energy = pd.DataFrame({'Energy Supply': [100, 200, 300], 'Temperature': [201, 202, 203]}) 
energy2 = energy.apply(
    lambda row: row.set_value('Energy Supply', row['Energy Supply']*1000000), 
    axis=1 
) 
energy # has been modified 

본 같이 .copy()를 사용하여 오리지널 프레임의 비표준 부작용을 피할 수있다 :

import pandas as pd 
energy = pd.DataFrame({'Energy Supply': [100, 200, 300], 'Temperature': [201, 202, 203]}) 
energy = energy.apply(
    lambda row: row.copy().set_value('Energy Supply', row['Energy Supply']*1000000), 
    axis=1 
) 

B 새로운 데이터 프레임을 생성하려고하지 않으므로, 당신이 실제로) 기존 dataframe을 수정하려면, 당신은 단지 사용하는 팬더의 가장 표준적인 방법이 될 것이다, 대신에이 작업을 수행 할 수 있습니다 :

import pandas as pd 
energy = pd.DataFrame({'Energy Supply': [100, 200, 300], 'Temperature': [201, 202, 203]}) 
energy['Energy Supply'] *= 1000000 
# or energy.loc[:, 'Energy Supply'] *= 1000000 

그것이 있어야하므로이 예제는 또한, 계산을 벡터화 NumPy와 사용 이전 것보다 훨씬 빠릅니다. 실제로는 람다 필요 않는 아주 간단한 방법이있다

2

람다의 아이디어는 그들은 단지 그래서 당신은 단지 row를 반환 할 수있는 입력 매개 변수 (더 자세한 답변을 this answer 확인)

을에서 작동, 그들은이 "부작용"을하지 않는다는 것입니다 Energy Supply가 1 백만을 곱한되면서 :

gigajoule = lambda row: dict([(k,v*1000000) if k=='Energy Supply' else (k,v) for k,v in row.items()]) 

그리고 다음과 같이 사용 :

>>> row = {'something': 1, 'Energy Supply': 1} 
>>> row = gigajoule(row) 
>>> row 
{'Energy Supply': 1000000, 'something': 1} 

하지만 실제로는 본격적인 기능이 제대로 작동하고 훨씬 더 읽기 쉽습니다.

0

:

energy['Energy Supply'] *= 1000000