[python] 팬더 : 단일 열에 apply () 함수를 어떻게 사용할 수 있습니까?

두 개의 열이있는 팬더 데이터 프레임이 있습니다. 두 번째 열에 영향을주지 않고 첫 번째 열의 값을 변경하고 첫 번째 열 값만 변경하여 전체 데이터 프레임을 다시 가져와야합니다. 팬더에서 apply를 사용하여 어떻게 할 수 있습니까?



답변

샘플 데이터 프레임 df은 다음과 같습니다.

a,b
1,2
2,3
3,4
4,5

당신이 원하는 것은 :

df['a'] = df['a'].apply(lambda x: x + 1)

그 결과는 다음과 같습니다.

   a  b
0  2  2
1  3  3
2  4  4
3  5  5


답변

다음과 같이 단일 컬럼을 사용하는 것이 좋습니다 map().

df = pd.DataFrame([{'a': 15, 'b': 15, 'c': 5}, {'a': 20, 'b': 10, 'c': 7}, {'a': 25, 'b': 30, 'c': 9}])

    a   b  c
0  15  15  5
1  20  10  7
2  25  30  9



df['a'] = df['a'].map(lambda a: a / 2.)

      a   b  c
0   7.5  15  5
1  10.0  10  7
2  12.5  30  9


답변

전혀 기능이 필요하지 않습니다. 전체 열에서 직접 작업 할 수 있습니다.

데이터 예 :

>>> df = pd.DataFrame({'a': [100, 1000], 'b': [200, 2000], 'c': [300, 3000]})
>>> df

      a     b     c
0   100   200   300
1  1000  2000  3000

열의 모든 값의 절반 a:

>>> df.a = df.a / 2
>>> df

     a     b     c
0   50   200   300
1  500  2000  3000


답변

주어진 응답은 정확하지만 초기 데이터 프레임을 수정하는 것은 항상 바람직하지는 않습니다. OP가 “using apply” 을 예로 요청한 경우 새 데이터 프레임을 반환하는 버전을 원할 수도 있습니다 apply.

이것은 다음을 사용하여 가능합니다 assign: assign설명서에 나와있는 것처럼 기존 열에 유효합니다 (강조는 내 것입니다).

DataFrame에 새 열을 할당하십시오.

열 외에 모든 원래 열이 있는 새 개체 를 반환 합니다. 재 할당 된 기존 열을 덮어 씁니다 .

한마디로 :

In [1]: import pandas as pd

In [2]: df = pd.DataFrame([{'a': 15, 'b': 15, 'c': 5}, {'a': 20, 'b': 10, 'c': 7}, {'a': 25, 'b': 30, 'c': 9}])

In [3]: df.assign(a=lambda df: df.a / 2)
Out[3]:
      a   b  c
0   7.5  15  5
1  10.0  10  7
2  12.5  30  9

In [4]: df
Out[4]:
    a   b  c
0  15  15  5
1  20  10  7
2  25  30  9

함수는 수정하려는 열뿐만 아니라 전체 데이터 프레임에 전달되므로 람다에서 올바른 열을 선택해야합니다.


답변

apply 함수의 실행 속도에 정말로 관심이 있고 작업 할 거대한 데이터 세트가있는 경우 빠른 실행을 사용하여 더 빠르게 실행할 수 있습니다. 다음은 팬더 데이터 프레임에서 빠른 실행을위한 예입니다.

import pandas as pd
import swifter

def fnc(m):
    return m*3+4

df = pd.DataFrame({"m": [1,2,3,4,5,6], "c": [1,1,1,1,1,1], "x":[5,3,6,2,6,1]})

# apply a self created function to a single column in pandas
df["y"] = df.m.swifter.apply(fnc)

이렇게하면 모든 CPU 코어가 결과를 계산할 수 있으므로 일반 적용 기능보다 훨씬 빠릅니다. 그것이 당신에게 유용하게되면 알려주세요.


답변

datetime을 사용하고 null 또는 빈 공간을 고려하여 복잡한 계산을 시도해 보겠습니다. 날짜 시간 열에서 30 년을 줄이고 apply방법을 사용 lambda하고 날짜 시간 형식을 변환하고 있습니다. 줄 if x != '' else x은 빈 공간이나 널을 모두 처리합니다.

df['Date'] = df['Date'].fillna('')
df['Date'] = df['Date'].apply(lambda x : ((datetime.datetime.strptime(str(x), '%m/%d/%Y') - datetime.timedelta(days=30*365)).strftime('%Y%m%d')) if x != '' else x)


답변