판다들에게 논쟁으로 또 다른 전체 칼럼을 전달하는 방법()
다음을 사용하여 한 열의 결측값을 다른 열의 값으로 채우려고 합니다.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
(문서 참조), 일치하는 인덱스의 값을 사용하여 다음을 채웁니다.
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의 전체 구성은 요리책의 3원 패턴을 사용합니다(어떤 경우든 읽기 위해 비용을 지불함).의 벡터 버전입니다.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
panda.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)
또는 다음을 사용할 수도 있습니다.
In [8]: df.assign(Cat1=df['Cat1'].mask(df['Cat1'].isna(), df['Cat2']))
Out[8]:
Day Cat1 Cat2
0 1 cat mouse
1 2 dog elephant
2 3 cat giraf
3 4 ant ant
여기에 더 일반적인 접근법이 있습니다(필나 방법이 더 나을 수 있음).
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)
이것이 오래된 질문이라는 것을 알지만, 저는 최근에 비슷한 것을 할 필요가 있었습니다.다음을 사용할 수 있었습니다.
df = pd.DataFrame([["1","cat","mouse"],
["2","dog","elephant"],
["3","cat","giraf"],
["4",np.nan,"ant"]],columns=["Day","Cat1","Cat2"])
print(df)
Day Cat1 Cat2
0 1 cat mouse
1 2 dog elephant
2 3 cat giraf
3 4 NaN ant
df1 = df.bfill(axis=1).iloc[:, 1]
df1 = df1.to_frame()
print(df1)
산출물:
Cat1
0 cat
1 dog
2 cat
3 ant
이것이 누군가에게 도움이 되기를 바랍니다!
언급URL : https://stackoverflow.com/questions/30357276/how-to-pass-another-entire-column-as-argument-to-pandas-fillna
'programing' 카테고리의 다른 글
간단한 rsa 도커에 명령을 보내려면 어떻게 해야 합니까? (0) | 2023.08.09 |
---|---|
div 클래스의 스타일 속성을 변경하기 위한 jquery (0) | 2023.08.09 |
페이지를 다시 로드하지 않고 쿼리 문자열 수정 (0) | 2023.08.09 |
iframe 내부의 div 스타일에 영향을 주기 위해 CSS 사용 (0) | 2023.08.09 |
Android Studio 수동으로 Gradle Sync를 실행하는 방법은 무엇입니까? (0) | 2023.08.09 |