두 개의 열이있는 팬더 데이터 프레임이 있습니다. 두 번째 열에 영향을주지 않고 첫 번째 열의 값을 변경하고 첫 번째 열 값만 변경하여 전체 데이터 프레임을 다시 가져와야합니다. 팬더에서 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)