의 사용 :파이썬, 내가 코드 문 다음 한 람다
def gigajoule(row):
row['Energy Supply'] *= 1000000
return row
energy = energy.apply(gigajoule, axis = 1)
아마 람다 함수를 사용하여 간단하게 할 수있는 방법이 있어야합니다,하지만 난 그렇게하는 방법을 알아낼 수 없습니다.
의 사용 :파이썬, 내가 코드 문 다음 한 람다
def gigajoule(row):
row['Energy Supply'] *= 1000000
return row
energy = energy.apply(gigajoule, axis = 1)
아마 람다 함수를 사용하여 간단하게 할 수있는 방법이 있어야합니다,하지만 난 그렇게하는 방법을 알아낼 수 없습니다.
예제 코드에서는 일반적인 사용 패턴과 다르게 df.apply
을 사용하고 있습니다. 정상적인 사용법은 원본 데이터를 수정하지 않고 제공된 데이터에서 값의 새로운 행을 생성하는 것입니다 (.apply() documentation의 부작용에 대한 경고 참조). 또한 lambda
함수가 동작하는 방식이기도합니다. 즉, 한 줄 계산을 통해 새 값을 생성하지만 직접 할당을 수행 할 수는 없습니다. 그러나, 귀하의 경우에, 당신은 주어진 행을 수정하고 그것을 반환하고 있습니다.
코드가 예상 한 것과 다른 일을 할 수도 있습니다. 로우 리턴 어셈블
gigajoule
가 dataframegigajoule
에서 행을 수신하도록 변경하는 것이 가능한 원래 dataframe 자체gigajoule
수정받은 로우 리턴 개질 행gigajoule
으로 새 데이터 프레임에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와 사용 이전 것보다 훨씬 빠릅니다. 실제로는 람다 필요 않는 아주 간단한 방법이있다
람다의 아이디어는 그들은 단지 그래서 당신은 단지 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}
하지만 실제로는 본격적인 기능이 제대로 작동하고 훨씬 더 읽기 쉽습니다.
:
energy['Energy Supply'] *= 1000000
주면서 당신이 입력 변수를 변경할 수 있지만, (이 팬더입니다 가정하는 경우에 당신이 태그를해야하지 (쉽게) 할 적절하게) 행이 출력으로 바뀌기 때문에 부작용이 아닌 것처럼 보입니다. –