이러한 벡터화 방법을 기본 예제와 함께 사용하는시기를 알려주시겠습니까?
그 볼 map
A는 Series
있는 나머지 반면, 방법 DataFrame
방법. 나는 혼동있어 apply
및 applymap
방법하지만. 왜 DataFrame에 함수를 적용하는 두 가지 방법이 있습니까? 사용법을 보여주는 간단한 예제도 훌륭합니다!
답변
Wes McKinney의 Python for Data Analysis 책에서 바로 pg. 132 (이 책을 강력히 추천합니다) :
또 다른 빈번한 작업은 1D 배열의 함수를 각 열 또는 행에 적용하는 것입니다. DataFrame의 apply 메소드는 정확히 다음을 수행합니다.
In [116]: frame = DataFrame(np.random.randn(4, 3), columns=list('bde'), index=['Utah', 'Ohio', 'Texas', 'Oregon'])
In [117]: frame
Out[117]:
b d e
Utah -0.029638 1.081563 1.280300
Ohio 0.647747 0.831136 -1.549481
Texas 0.513416 -0.884417 0.195343
Oregon -0.485454 -0.477388 -0.309548
In [118]: f = lambda x: x.max() - x.min()
In [119]: frame.apply(f)
Out[119]:
b 1.133201
d 1.965980
e 2.829781
dtype: float64
가장 일반적인 배열 통계 (sum 및 mean과 같은)는 DataFrame 메서드이므로 apply를 사용할 필요가 없습니다.
요소 별 파이썬 함수도 사용할 수 있습니다. 프레임의 각 부동 소수점 값에서 형식화 된 문자열을 계산하려고한다고 가정하십시오. applymap으로이를 수행 할 수 있습니다.
In [120]: format = lambda x: '%.2f' % x
In [121]: frame.applymap(format)
Out[121]:
b d e
Utah -0.03 1.08 1.28
Ohio 0.65 0.83 -1.55
Texas 0.51 -0.88 0.20
Oregon -0.49 -0.48 -0.31
applymap이라는 이름의 이유는 Series에 요소 별 함수를 적용하기위한 map 메소드가 있기 때문입니다.
In [122]: frame['e'].map(format)
Out[122]:
Utah 1.28
Ohio -1.55
Texas 0.20
Oregon -0.31
Name: e, dtype: object
요약 apply
하면 DataFrame의 행 / 열 기준으로 applymap
작동 하고 DataFrame에서 요소별로 map
작동하며 Series에서 요소별로 작동합니다.
답변
비교 map
, applymap
그리고 : 컨텍스트 사항을ap
ply
첫 번째 주요 차이점 : 정의
map
시리즈에만 정의됩니다applymap
DataFrames에서만 정의됩니다.apply
BOTH에 정의되어 있습니다.
두 번째 주요 차이점 : 입력 인수
map
받아dict
들,Series
또는 호출을applymap
그리고apply
단지 callables을 받아
세 번째 주요 차이점 : 행동
map
시리즈의 요소입니다applymap
DataFrames의 요소 단위입니다.apply
또한 요소 단위로 작동하지만 더 복잡한 작업 및 집계에 적합합니다. 동작 및 반환 값은 기능에 따라 다릅니다.
네 번째 주요 차이점 (가장 중요한 것) : USE CASE
map
그래서 성능에 최적화되어, 한 도메인에서 다른 도메인으로 매핑 값을 의미한다 (예df['A'].map({1:'a', 2:'b', 3:'c'})
)applymap
이다 다수의 행 / 열에서 elementwise 변환을위한 좋은 (예df[['A', 'B', 'C']].applymap(str.strip)
)apply
벡터화 할 수없는 어떤 기능을 적용하기위한 것이다 (예df['sentences'].apply(nltk.sent_tokenize)
)
요약
각주
map
사전 / 시리즈가 전달되면 해당 사전 / 시리즈의 키를 기반으로 요소를 매핑합니다. 결 측값은 출력에서 NaN으로 기록됩니다.
applymap
최신 버전에서는 일부 작업에 맞게 최적화되었습니다. 당신은 발견 할 것이다applymap
약간보다 빠른apply
경우도있다. 내 제안은 둘 다 테스트하고 더 잘 작동하는 것을 사용하는 것입니다.
map
요소 별 매핑 및 변환에 최적화되어 있습니다. 사전 또는 시리즈와 관련된 작업을 수행하면 팬더가 더 빠른 코드 경로를 사용하여 성능을 향상시킬 수 있습니다.Series.apply
집계 연산에 대한 스칼라를 리턴하고 그렇지 않으면 Series를 리턴합니다. 마찬가지로DataFrame.apply
. 주apply
와 같은 특정 NumPy와 함수를 호출하는 경우도 FastPaths와있다mean
,
sum
등
답변
이 답변에는 훌륭한 정보가 있지만 배열 방식과 요소 방식으로 작동하는 방법을 명확하게 요약하기 위해 내 자신을 추가하고 있습니다. jeremiahbuddha는 대부분이 작업을 수행했지만 Series.apply는 언급하지 않았습니다. 의견을 말할 담당자가 없습니다.
-
DataFrame.apply
한 번에 전체 행 또는 열에서 작동합니다. -
DataFrame.applymap
,Series.apply
및Series.map
한 번에 하나의 요소에서 작동합니다.
의 기능과 중복이 많이 있습니다 Series.apply
및 Series.map
중 하나는 대부분의 경우에 작동합니다 의미는. 그들은 약간의 차이가 있지만 그 중 일부는 osa의 답변에서 논의되었습니다.
답변
다른 답변에 추가하여 map 과 applySeries
도 있습니다 .
Apply는 DataFrame을 계열로 만들 수 있습니다 . 그러나 map은 다른 시리즈의 모든 셀에 시리즈를 넣을 것입니다.
In [40]: p=pd.Series([1,2,3])
In [41]: p
Out[31]:
0 1
1 2
2 3
dtype: int64
In [42]: p.apply(lambda x: pd.Series([x, x]))
Out[42]:
0 1
0 1 1
1 2 2
2 3 3
In [43]: p.map(lambda x: pd.Series([x, x]))
Out[43]:
0 0 1
1 1
dtype: int64
1 0 2
1 2
dtype: int64
2 0 3
1 3
dtype: int64
dtype: object
또한 “웹 서버에 연결”과 같은 부작용이있는 기능을 가지고 있다면 apply
명확성을 위해 아마도 사용할 것입니다 .
series.apply(download_file_for_every_element)
Map
함수뿐만 아니라 사전이나 다른 시리즈도 사용할 수 있습니다. 순열 을 조작하고 싶다고 가정 해 봅시다 .
갖다
1 2 3 4 5
2 1 4 5 3
이 순열의 제곱은
1 2 3 4 5
1 2 5 3 4
를 사용하여 계산할 수 있습니다 map
. 자체 응용 프로그램이 문서화되어 있는지 확실하지 않지만에서 작동합니다 0.15.1
.
In [39]: p=pd.Series([1,0,3,4,2])
In [40]: p.map(p)
Out[40]:
0 0
1 1
2 4
3 2
4 3
dtype: int64
답변
@jeremiahbuddha는 applymap이 요소 단위로 작동하는 동안 행 / 열에 적용되는 것으로 언급했습니다. 그러나 여전히 요소 별 계산에 apply를 사용할 수 있습니다 ….
frame.apply(np.sqrt)
Out[102]:
b d e
Utah NaN 1.435159 NaN
Ohio 1.098164 0.510594 0.729748
Texas NaN 0.456436 0.697337
Oregon 0.359079 NaN NaN
frame.applymap(np.sqrt)
Out[103]:
b d e
Utah NaN 1.435159 NaN
Ohio 1.098164 0.510594 0.729748
Texas NaN 0.456436 0.697337
Oregon 0.359079 NaN NaN
답변
내가 조금 고생하면서 지적하고 싶었다.
def f(x):
if x < 0:
x = 0
elif x > 100000:
x = 100000
return x
df.applymap(f)
df.describe()
이것은 데이터 프레임 자체를 수정하지 않으므로 다시 할당해야합니다.
df = df.applymap(f)
df.describe()
답변
applymap과 applymap의 차이점에 대한 가장 간단한 설명은 다음과 같습니다.
apply 는 전체 열을 매개 변수로 사용하고 결과를이 열에 지정합니다
applymap 은 별도의 셀 값을 매개 변수로 사용하여 결과를이 셀에 다시 지정합니다.
NB apply가 단일 값을 반환하면 할당 후 열 대신이 값을 갖게되고 결국 행렬 대신 행만 갖게됩니다.