Pandas의 map, applymap 및 apply 메소드의 차이점 DataFrame방법. 나는 혼동있어 apply및 applymap방법하지만. 왜 DataFrame에

이러한 벡터화 방법을 기본 예제와 함께 사용하는시기를 알려주시겠습니까?

그 볼 mapA는 Series있는 나머지 반면, 방법 DataFrame방법. 나는 혼동있어 applyapplymap방법하지만. 왜 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그리고 : 컨텍스트 사항을apply

첫 번째 주요 차이점 : 정의

  • 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))

요약

여기에 이미지 설명을 입력하십시오

각주

  1. map사전 / 시리즈가 전달되면 해당 사전 / 시리즈의 키를 기반으로 요소를 매핑합니다. 결 측값은 출력에서 ​​NaN으로 기록됩니다.
  2. applymap최신 버전에서는 일부 작업에 맞게 최적화되었습니다. 당신은 발견 할 것이다 applymap약간보다 빠른 apply경우도있다. 내 제안은 둘 다 테스트하고 더 잘 작동하는 것을 사용하는 것입니다.

  3. map요소 별 매핑 및 변환에 최적화되어 있습니다. 사전 또는 시리즈와 관련된 작업을 수행하면 팬더가 더 빠른 코드 경로를 사용하여 성능을 향상시킬 수 있습니다.

  4. Series.apply집계 연산에 대한 스칼라를 리턴하고 그렇지 않으면 Series를 리턴합니다. 마찬가지로 DataFrame.apply. 주 apply와 같은 특정 NumPy와 함수를 호출하는 경우도 FastPaths와있다 mean,
    sum

답변

이 답변에는 훌륭한 정보가 있지만 배열 방식과 요소 방식으로 작동하는 방법을 명확하게 요약하기 위해 내 자신을 추가하고 있습니다. jeremiahbuddha는 대부분이 작업을 수행했지만 Series.apply는 언급하지 않았습니다. 의견을 말할 담당자가 없습니다.

  • DataFrame.apply 한 번에 전체 행 또는 열에서 작동합니다.

  • DataFrame.applymap, Series.applySeries.map한 번에 하나의 요소에서 작동합니다.

의 기능과 중복이 많이 있습니다 Series.applySeries.map중 하나는 대부분의 경우에 작동합니다 의미는. 그들은 약간의 차이가 있지만 그 중 일부는 osa의 답변에서 논의되었습니다.


답변

다른 답변에 추가하여 mapapplySeries있습니다 .

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가 단일 값을 반환하면 할당 후 열 대신이 값을 갖게되고 결국 행렬 대신 행만 갖게됩니다.