sourcecode

Panda의 지도, 적용 지도, 적용 방법의 차이

copyscript 2023. 1. 15. 17:11
반응형

Panda의 지도, 적용 지도, 적용 방법의 차이

이러한 벡터화 방법을 사용할 때의 기본적인 예를 가르쳐 주실 수 있습니까?

요.map는 입니다.Series 의 방법DataFrame★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★apply ★★★★★★★★★★★★★★★★★」applymap법이있있 있있있다다Data Frame에 함수를 적용하는 방법이 두 가지 있는 이유는 무엇입니까?다시 한 번, 사용법을 설명하는 간단한 예시가 좋습니다!

Wes McKinney의 Python for Data Analysis 책, 132페이지에서 직접 인용한 내용(이 책을 적극 추천합니다.

또 다른 빈번한 작업은 각 열이나 행에 1D 어레이의 기능을 적용하는 것입니다.DataFrame의 적용 메서드는 정확히 다음과 같습니다.

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

가장 일반적인 배열 통계 정보(합계 및 평균 등)의 대부분은 DataFrame 메서드이므로 apply를 사용할 필요가 없습니다.

요소별 Python 함수도 사용할 수 있습니다.프레임의 각 부동소수점 값에서 형식화된 문자열을 계산한다고 가정합니다.이 작업은 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에 요소별 함수를 적용하기 위한 맵 방식이 있기 때문입니다.

In [122]: frame['e'].map(format)
Out[122]: 
Utah       1.28
Ohio      -1.55
Texas      0.20
Oregon    -0.31
Name: e, dtype: object

【자 summ】apply는 DataFrame 합니다.applymap는 DataFrame "Data Frame" 상에서 로 동작합니다.map는 시리즈 상에서 요소별로 동작합니다.

와의 비교: 컨텍스트의 중요성

첫 번째 주요 차이점: 정의

  • map는 Series ONLY 에서되어 있습니다.
  • applymap는 DataFrames 에서 되어 있습니다.
  • apply는 BOTHTOTH에되어 있습니다.

두 번째 주요 차이점:입력 인수

  • mapdicts,Series 콜 .
  • applymap ★★★★★★★★★★★★★★★★★」apply callables (콜러블만 )

세 번째 주요 차이점: 행동

  • map for Series (의 경우)
  • applymap for Frames 。
  • apply또한 요소별로 작동하지만 보다 복잡한 운영 및 통합에 적합합니다.동작과 반환값은 함수에 따라 달라집니다.

네 번째 주요 차이(가장 중요한 차이):사용 사례

  • map는 어떤 도메인으로 를 들어, 「」는 「」, 「」, 「」는 「」, 「」, 「」는 「」, 「」, 「」, 「」, 「」는 「」, 「」, 「」, 「」(등).df['A'].map({1:'a', 2:'b', 3:'c'}))
  • applymap는, 의 행를 들면, 「」, 「」/「」등)에 적합합니다.df[['A', 'B', 'C']].applymap(str.strip))
  • apply할 수 함수(를 들면, 다음과 같이)를하기 위한 입니다.df['sentences'].apply(nltk.sent_tokenize)를 참조해 주세요.

또, 코드에 panda apply()를 사용하는(사용하지 않는) 타이밍도 참조해 주세요.쓰기에 가장 적합한 시나리오에 대해 얼마 전에 작성했습니다.apply(적용속도는 보통 느리지만 많은 수는 없지만 몇 개 있습니다).


정리

여기에 이미지 설명 입력

각주

  1. map사전/시리즈를 통과하면 해당 사전/시리즈의 키를 기반으로 요소가 매핑됩니다.NaN을 사용하다

  2. applymap최신 버전에서는 일부 작업에 최적화되어 있습니다. 수 있습니다.applymap apply경우에 따라서는.둘 다 테스트하고 더 잘 되는 것을 사용하자는 것이 제 제안입니다.

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

  4. Series.apply는 오퍼레이션을 집약하기 위한 스칼라를 반환합니다.시리즈마찬가지로DataFrame.apply해 주세요.apply, 에는, NumPy 함수와 , 패스가 .mean,sum 등등.

간단한 개요

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

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

Series.apply ★★★★★★★★★★★★★★★★★」Series.map유사하며 종종 교환이 가능합니다.이들의 약간의 차이는 아래 osa의 답변에 설명되어 있습니다.

또 다른 '아, 아, 아, 아는데요.Series지도와 적용도 있습니다.

Apply는 일련의 Data Frame을 만들있지만, 지도는 다른 시리즈의 모든 셀에 하나의 시리즈를 넣을 뿐이며, 이는 원하는 것이 아닐 수 있습니다.

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

@capplybuddha는 apply가 행/행에서 동작하는 반면 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

가장 간단한 설명은 apply와 applymap의 차이입니다.

apply는 열 전체를 파라미터로 하여 결과를 이 열에 할당합니다.

applymap은 개별 셀 값을 파라미터로 사용하여 결과를 이 셀에 할당합니다.

NB 적용하면 할당 후 열 대신 이 값이 반환되고 행렬 대신 행만 있게 됩니다.

지적하고 싶은 게 있어요. 제가 이 문제로 좀 고생했었거든.

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

CS95의 답변에 근거합니다.

  • map는 Series ONLY 에서되어 있습니다.
  • applymap는 DataFrames 에서 되어 있습니다.
  • apply는 BOTHTOTH에되어 있습니다.

몇 가지 예를 들다

In [3]: frame = pd.DataFrame(np.random.randn(4, 3), columns=list('bde'), index=['Utah', 'Ohio', 'Texas', 'Oregon'])

In [4]: frame
Out[4]:
            b         d         e
Utah    0.129885 -0.475957 -0.207679
Ohio   -2.978331 -1.015918  0.784675
Texas  -0.256689 -0.226366  2.262588
Oregon  2.605526  1.139105 -0.927518

In [5]: myformat=lambda x: f'{x:.2f}'

In [6]: frame.d.map(myformat)
Out[6]:
Utah      -0.48
Ohio      -1.02
Texas     -0.23
Oregon     1.14
Name: d, dtype: object

In [7]: frame.d.apply(myformat)
Out[7]:
Utah      -0.48
Ohio      -1.02
Texas     -0.23
Oregon     1.14
Name: d, dtype: object

In [8]: frame.applymap(myformat)
Out[8]:
            b      d      e
Utah     0.13  -0.48  -0.21
Ohio    -2.98  -1.02   0.78
Texas   -0.26  -0.23   2.26
Oregon   2.61   1.14  -0.93

In [9]: frame.apply(lambda x: x.apply(myformat))
Out[9]:
            b      d      e
Utah     0.13  -0.48  -0.21
Ohio    -2.98  -1.02   0.78
Texas   -0.26  -0.23   2.26
Oregon   2.61   1.14  -0.93


In [10]: myfunc=lambda x: x**2

In [11]: frame.applymap(myfunc)
Out[11]:
            b         d         e
Utah    0.016870  0.226535  0.043131
Ohio    8.870453  1.032089  0.615714
Texas   0.065889  0.051242  5.119305
Oregon  6.788766  1.297560  0.860289

In [12]: frame.apply(myfunc)
Out[12]:
            b         d         e
Utah    0.016870  0.226535  0.043131
Ohio    8.870453  1.032089  0.615714
Texas   0.065889  0.051242  5.119305
Oregon  6.788766  1.297560  0.860289

추가적인 문맥과 직관을 위해, 여기 그 차이에 대한 명확하고 구체적인 예가 있습니다.

아래에 다음과 같은 함수가 있다고 가정합니다. (이 라벨 함수는 매개 변수(x)로 제공한 임계값을 기준으로 값을 임의로 '높음'과 '낮음'으로 나눕니다.)

def label(element, x):
    if element > x:
        return 'High'
    else:
        return 'Low'

이 예에서는 데이터 프레임에 난수가 있는 열이 1개 있다고 가정합니다.

난수가 있는 하나의 열이 있는 Df

라벨 함수와 맵을 매핑하려고 했을 경우:

df['ColumnName'].map(label, x = 0.8)

다음과 같은 오류가 발생합니다.

TypeError: map() got an unexpected keyword argument 'x'

이제 동일한 기능을 사용하여 apply를 사용하면 다음과 같이 작동합니다.

df['ColumnName'].apply(label, x=0.8)

Series.apply()는 요소별로 추가 인수를 사용할 수 있지만 Series.map() 메서드는 오류를 반환합니다.

데이터 프레임 내의 여러 열에 동일한 함수를 동시에 적용하려는 경우 DataFrame.applymap()이 사용됩니다.

df[['ColumnName','ColumnName2','ColumnName3','ColumnName4']].applymap(label)

마지막으로 데이터 프레임에서도 apply() 메서드를 사용할 수 있지만 DataFrame.apply() 메서드는 기능이 다릅니다.df.apply() 메서드는 함수를 요소별로 적용하는 대신 열 단위 또는 행 단위로 축을 따라 함수를 적용합니다.df.apply()와 함께 사용할 함수를 만들 때 열을 받아들이도록 설정합니다.

다음은 예를 제시하겠습니다.

df.apply(pd.value_counts)

pd.value_counts 함수를 데이터 프레임에 적용했을 때 모든 열의 값 카운트가 계산되었습니다.

df.apply() 메서드를 사용하여 여러 열을 변환하는 경우 이 기능은 매우 중요합니다.이것은 pd.value_counts 함수가 연속적으로 동작하기 때문에 가능합니다.df.apply() 메서드를 사용하여 요소별로 작동하는 함수를 여러 열에 적용하려고 하면 다음과 같은 오류가 발생합니다.

예를 들어 다음과 같습니다.

def label(element):
    if element > 1:
        return 'High'
    else:
        return 'Low'

df[['ColumnName','ColumnName2','ColumnName3','ColumnName4']].apply(label)

그 결과, 다음의 에러가 발생합니다.

ValueError: ('The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().', u'occurred at index Economy')

일반적으로 apply() 메서드는 벡터화된 함수가 존재하지 않는 경우에만 사용해야 합니다.판다들은 성능을 최적화하기 위해 전체 시리즈에 동시에 작업을 적용하는 프로세스인 벡터화를 사용한다는 점을 기억하십시오.apply() 메서드를 사용하면 실제로 행을 루프하기 때문에 벡터화된 메서드는 apply() 메서드보다 더 빠르게 동등한 작업을 수행할 수 있습니다.

적용, 적용 맵, 맵 집약

다음으로 이미 존재하는 벡터화된 함수의 몇 가지 예를 제시하겠습니다.이러한 함수는 어떤 유형의 적용/매핑 방식에서도 재생성하지 않습니다.

  1. Series.str.split() 시리즈 내의 각 요소를 분할합니다.
  2. Series.str.strip() 시리즈 내의 각 문자열에서 공백을 제거합니다.
  3. Series.str.lower() Series 문자열을 소문자로 변환합니다.
  4. Series.str.uper() Series 문자열을 대문자로 변환합니다.
  5. Series.str.get() 시리즈 내 각 요소의 ih 요소를 검색합니다.
  6. Series.str.replace() Series의 regex 또는 문자열을 다른 문자열로 바꿉니다.
  7. Series.str.cat() 시리즈의 문자열을 연결합니다.
  8. Series.str.extract() regex 패턴과 일치하는 Series에서 하위 문자열을 추출합니다.

제가 아는 바로는:

기능적 관점에서:

에 열 내에서 , "/"를 합니다.apply.

::lambda x: x.max()-x.mean().

함수를 각 요소에 적용하는 경우:

> 1 > </ > 를 사용합니다.apply

전체에 2> 데이터 프레임 전체를 사용합니다.applymap

majority = lambda x : x > 17
df2['legal_drinker'] = df2['age'].apply(majority)

def times10(x):
  if type(x) is int:
    x *= 10 
  return x
df2.applymap(times10)

FOMO:

다음 예시는 에 적용되어 있습니다.DataFrame.

map 기능은 Series에만 적용됩니다.Data Frame에서는 신청할 수 없습니다.

기억해야 할 것은 이 제품은 모든 을 할 수 있지만 eXtra 옵션이 있다는 것입니다.

은 다음과 같습니다.axis ★★★★★★★★★★★★★★★★★」result_type서 ''는result_type은, 「 」의 경우 뿐입니다.axis=1(일부러)

df = DataFrame(1, columns=list('abc'),
                  index=list('1234'))
print(df)

f = lambda x: np.log(x)
print(df.applymap(f)) # apply to the whole dataframe
print(np.log(df)) # applied to the whole dataframe
print(df.applymap(np.sum)) # reducing can be applied for rows only

# apply can take different options (vs. applymap cannot)
print(df.apply(f)) # same as applymap
print(df.apply(sum, axis=1))  # reducing example
print(df.apply(np.log, axis=1)) # cannot reduce
print(df.apply(lambda x: [1, 2, 3], axis=1, result_type='expand')) # expand result

sidenote로서 Series 함수는 Python 함수와 혼동해서는 안 됩니다.

첫 번째 값은 Series에 적용되어 값을 매핑하고 두 번째 값은 반복 가능한 모든 항목에 매핑합니다.


마지막으로 dataframe 방식과 groupby 방식을 혼동하지 마십시오.

언급URL : https://stackoverflow.com/questions/19798153/difference-between-map-applymap-and-apply-methods-in-pandas

반응형