반응형
Pandas fillna ()에 인수로 다른 전체 열을 전달하는 방법
fillna
방법을 사용하여 한 열의 누락 된 값을 다른 열의 값으로 채우고 싶습니다 .
(각각 행을 반복하는 것은 매우 나쁜 습관이며 모든 것을 번에 수행하는 것이 더 좋을 것 fillna
입니다.)
이전 데이터 :
Day Cat1 Cat2
1 cat mouse
2 dog elephant
3 cat giraf
4 NaN ant
이후 데이터 :
Day Cat1 Cat2
1 cat mouse
2 dog elephant
3 cat giraf
4 ant ant
이 열을 제공 할 수 있습니다 fillna
( docs 참조 ), 일치하는 색인에서 해당 값을 사용하여 채에.
In [17]: df['Cat1'].fillna(df['Cat2'])
Out[17]:
0 cat
1 dog
2 cat
3 ant
Name: Cat1, dtype: object
당신은 할 수 있습니다
df.Cat1 = np.where(df.Cat1.isnull(), df.Cat2, df.Cat1)
RHS의 전체 구조 는 pandas
요리 책 의 삼항 패턴을 사용 합니다. (어 · 든 읽기에 비용 이 많이 ). 의 벡터 버전입니다 a? b: c
.
value
대신 매개 변수를 사용하십시오 method
.
In [20]: df
Out[20]:
Cat1 Cat2 Day
0 cat mouse 1
1 dog elephant 2
2 cat giraf 3
3 NaN ant 4
In [21]: df.Cat1 = df.Cat1.fillna(value=df.Cat2)
In [22]: df
Out[22]:
Cat1 Cat2 Day
0 cat mouse 1
1 dog elephant 2
2 cat giraf 3
3 ant ant 4
pandas.DataFrame.combine_first 도 작동합니다.
( 주의 : "결과 색인 열은 각 색인과 열의 합집합이됩니다"이므로 색인과 열이 일치하는지 확인해야합니다. )
import numpy as np
import pandas as pd
df = pd.DataFrame([["1","cat","mouse"],
["2","dog","elephant"],
["3","cat","giraf"],
["4",np.nan,"ant"]],columns=["Day","Cat1","Cat2"])
In: df["Cat1"].combine_first(df["Cat2"])
Out:
0 cat
1 dog
2 cat
3 ant
Name: Cat1, dtype: object
다른 답변과 비교 :
%timeit df["Cat1"].combine_first(df["Cat2"])
181 µs ± 11.3 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeit df['Cat1'].fillna(df['Cat2'])
253 µs ± 10.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit np.where(df.Cat1.isnull(), df.Cat2, df.Cat1)
88.1 µs ± 793 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
아래에서는이 방법을 사용하지 않았습니다.
def is_missing(Cat1,Cat2):
if np.isnan(Cat1):
return Cat2
else:
return Cat1
df['Cat1'] = df.apply(lambda x: is_missing(x['Cat1'],x['Cat2']),axis=1)
예외가 발생하기 때문입니다.
TypeError: ("ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''", 'occurred at index 0')
즉, np.isnan은 기본 dtype (예 : np.float64)의 NumPy 배열에 적용될 수 있지만 객체 배열에 적용될 때 TypeError를 발생 시킵니다.
그래서 방법을 수정합니다.
def is_missing(Cat1,Cat2):
if pd.isnull(Cat1):
return Cat2
else:
return Cat1
%timeit df.apply(lambda x: is_missing(x['Cat1'],x['Cat2']),axis=1)
701 µs ± 7.38 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
다음은보다 일반적인 접근 방식입니다 (fillna 방법이 아마도 더 좋습니다).
def is_missing(Cat1,Cat2):
if np.isnan(Cat1):
return Cat2
else:
return Cat1
df['Cat1'] = df.apply(lambda x: is_missing(x['Cat1'],x['Cat2']),axis=1)
반응형
'ProgramingTip' 카테고리의 다른 글
T-SQL 및 WHERE LIKE % 매개 변수 % 절 (0) | 2020.11.13 |
---|---|
Javascript 클래스가 다른 클래스를 상속하는지 확인하는 방법 (obj를 생성하지 않고)? (0) | 2020.11.13 |
if (expr) 대신 if (!! (expr)) 사용 (0) | 2020.11.13 |
오류 TS1005 : ';' (0) | 2020.11.13 |
마스터 페이지 이상 함- "콘텐츠 컨트롤은 콘텐츠 페이지의 최상위 컨트롤이거나 마스터 페이지를 참조하는 중첩 된 마스터 페이지가 있습니다." (0) | 2020.11.13 |