팬더 데이터 프레임 fillna () 일부 열만 배치


145

팬더 데이터 프레임에서 열의 일부 하위 집합에 대해서만 0으로 값을 채우려 고하지 않습니다.

내가 할 때 :

import pandas as pd
df = pd.DataFrame(data={'a':[1,2,3,None],'b':[4,5,None,6],'c':[None,None,7,8]})
print df
df.fillna(value=0, inplace=True)
print df

출력 :

     a    b    c
0  1.0  4.0  NaN
1  2.0  5.0  NaN
2  3.0  NaN  7.0
3  NaN  6.0  8.0
     a    b    c
0  1.0  4.0  0.0
1  2.0  5.0  0.0
2  3.0  0.0  7.0
3  0.0  6.0  8.0

모든 것을의 None로 바꿉니다 0. 무엇 내가하고 싶은 만 교체 None열에들 a하고 b있지만 c.

가장 좋은 방법은 무엇입니까?

답변:


219

원하는 열을 선택하고 할당하여 수행 할 수 있습니다.

df[['a', 'b']] = df[['a','b']].fillna(value=0)

결과 출력은 다음과 같습니다.

     a    b    c
0  1.0  4.0  NaN
1  2.0  5.0  NaN
2  3.0  0.0  7.0
3  0.0  6.0  8.0

예, 이것이 바로 내가 원하는 것입니다! 감사합니다. 이 작업을 수행하는 방법이 있습니까? 내 원래 데이터 프레임이 꽤 큽니다.
Sait

1
어쨌든 orig df를 덮어
쓰면서이

4
이 장소는 여기에 불필요한 데, df[['a', 'b']] = df[['a','b']].fillna(value=0)계속 작동합니다
EdChum

2
@EdChum 임시 데이터 프레임을 생성하지 않으므로 더 많은 메모리가 필요합니까? (시간 복잡성보다 메모리에 더 관심이 있습니다.)
Sait

7
많은 작업에서 inplace여전히 사본에서 작동합니다. 그것이 사실인지 아닌지 모르겠습니다 fillna. 팬더 핵심 개발자 중 한 명이이 답변 을 보십시오 .
root

85

당신은 사용 할 수 있습니다 dict, fillna다른 컬럼에 대해 서로 다른 값으로

df.fillna({'a':0,'b':0})
Out[829]: 
     a    b    c
0  1.0  4.0  NaN
1  2.0  5.0  NaN
2  3.0  0.0  7.0
3  0.0  6.0  8.0

다시 할당 한 후

df=df.fillna({'a':0,'b':0})
df
Out[831]: 
     a    b    c
0  1.0  4.0  NaN
1  2.0  5.0  NaN
2  3.0  0.0  7.0
3  0.0  6.0  8.0

1
정말 멋진, Btw fromkeys당신이 원하는 경우 사용할 수있는 dict에 대한 +1
U10-Forward

1
실제로 다른 열에 대해 다른 값을 표시하면 답변 / 예가 더 명확합니다.
RufusVS

@RufusVS 맞습니다 만, 여전히 op의 예상 출력과 일치하려고합니다
YOBEN_S

1
예를 들어 다음과 함께 사용하는 경우 체인 인덱싱 문제를 피할 수 있기 때문에이 방법이 더 나은 솔루션입니다.df.fillna({'a':0,'b':0}, inplace=True)
Alex

19

Wen의 솔루션과 inplace = True를 사용하여 객체의 복사본을 만들지 않을 수 있습니다.

df.fillna({'a':0, 'b':0}, inplace=True)
print(df)

산출량 :

     a    b    c
0  1.0  4.0  NaN
1  2.0  5.0  NaN
2  3.0  0.0  7.0
3  0.0  6.0  8.0

1
이것이 올바른 반면 복사본을 피하는 것이 더 나을 필요는 없습니다 .
jpp

7

한 줄로 모든 작업을 수행하는 방법은 다음과 같습니다.

df[['a', 'b']].fillna(value=0, inplace=True)

분류 : df[['a', 'b']]NaN 값을 채우려는 열을 선택하고 value=0NaN을 0으로 채우도록 지시 inplace=True하며 개체의 복사본을 만들지 않고 변경 사항을 영구적으로 만듭니다.


7

최상위 답변을 사용하면 df 슬라이스 사본을 변경하는 것에 대한 경고가 생성됩니다. 다른 열이 있다고 가정하면 더 좋은 방법은 사전을 전달하는 것입니다.
df.fillna({'A': 'NA', 'B': 'NA'}, inplace=True)


3

또는 다음과 같은 것 :

df.loc[df['a'].isnull(),'a']=0
df.loc[df['b'].isnull(),'b']=0

그리고 더 많은 것이 있다면 :

for i in your_list:
    df.loc[df[i].isnull(),i]=0

0

때때로이 구문은 작동하지 않습니다 :

df[['col1','col2']] = df[['col1','col2']].fillna()

대신 다음을 사용하십시오.

df['col1','col2']
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.