Python Pandas는 한 열의 NaN을 두 번째 열의 해당 행의 값으로 바꿉니다.


103

이 Pandas DataFrame을 Python으로 사용하고 있습니다.

File    heat    Farheit Temp_Rating
   1    YesQ         75         N/A
   1    NoR         115         N/A
   1    YesA         63         N/A
   1    NoT          83          41
   1    NoY         100          80
   1    YesZ         56          12
   2    YesQ        111         N/A
   2    NoR          60         N/A
   2    YesA         19         N/A
   2    NoT         106          77
   2    NoY          45          21
   2    YesZ         40          54
   3    YesQ         84         N/A
   3    NoR          67         N/A
   3    YesA         94         N/A
   3    NoT          68          39
   3    NoY          63          46
   3    YesZ         34          81

Temp_Rating열의 모든 NaN을 다음 의 값 으로 바꿔야합니다 .Farheit .

이것이 내가 필요한 것입니다.

File        heat    Temp_Rating
   1        YesQ             75
   1         NoR            115
   1        YesA             63
   1        YesQ             41
   1         NoR             80
   1        YesA             12
   2        YesQ            111
   2         NoR             60
   2        YesA             19
   2         NoT             77
   2         NoY             21
   2        YesZ             54
   3        YesQ             84
   3         NoR             67
   3        YesA             94
   3         NoT             39
   3         NoY             46
   3        YesZ             81

부울 선택을하면 한 번에 하나의 열만 선택할 수 있습니다. 문제는 내가 그들과 합류하려고하면 올바른 순서를 유지하면서 이것을 할 수 없다는 것입니다.

s가 있는 Temp_Rating행만 찾아 열의 NaN동일한 행에있는 값으로 바꾸 려면 어떻게 해야 Farheit합니까?

답변:


165

DataFrame이 다음 위치에 있다고 가정합니다 df.

df.Temp_Rating.fillna(df.Farheit, inplace=True)
del df['Farheit']
df.columns = 'File heat Observations'.split()

먼저 NaN값을 해당 값으로 바꿉니다 df.Farheit. 'Farheit'열을 삭제하십시오 . 그런 다음 열의 이름을 바꿉니다. 결과는 다음과 같습니다 DataFrame.

결과 DataFrame


두 열 데이터 유형이 모두 객체이고 N / A 대신 해당 행의 빈 셀인 경우이 작업을 수행하는 방법은 무엇입니까?
ashish

고려할 수있는 한 가지 방법 : 먼저 빈 문자열을 NaN( 여기 참조 )로 바꾼 다음 방법 을 사용할 수 있습니다 .
edesz

답은 완벽합니다. 당신이 더 많은 팬더에 체류하고 싶으신 그냥 나도하여 열을 삭제하는 게 좋을 것 구문 df.drop("Farheit", axis=1),하지만 그게 아마 개인적인 취향
미카엘라

1
@MichaelA Agree는 drop이제 delPandas-land에서 선호합니다 . 최근 Pandas를 사용하는 경우 df = df.drop(columns='Farheit')숫자 축 번호 지정을 권장 합니다.
조나단 유니스

35

위에서 언급 한 솔루션은 저에게 효과적이지 않았습니다. 내가 사용한 방법은 다음과 같습니다.

df.loc[df['foo'].isnull(),'foo'] = df['bar']

3
예외가 발생 했습니까 아니면 단순히 작동하지 않습니까? isnull () 대신 isna ()를 사용해보십시오.
RufusVS

4

이 문제를 해결하는 다른 방법은

import pandas as pd
import numpy as np

ts_df = pd.DataFrame([[1,"YesQ",75,],[1,"NoR",115,],[1,"NoT",63,13],[2,"YesT",43,71]],columns=['File','heat','Farheit','Temp'])


def fx(x):
    if np.isnan(x['Temp']):
        return x['Farheit']
    else:
        return x['Temp']
print(1,ts_df)
ts_df['Temp']=ts_df.apply(lambda x : fx(x),axis=1)

print(2,ts_df)

보고:

(1,    File  heat  Farheit  Temp                                                                                    
0     1  YesQ       75   NaN                                                                                        
1     1   NoR      115   NaN                                                                                        
2     1   NoT       63  13.0                                                                                        
3     2  YesT       43  71.0)                                                                                       
(2,    File  heat  Farheit   Temp                                                                                   
0     1  YesQ       75   75.0                                                                                       
1     1   NoR      115  115.0
2     1   NoT       63   13.0
3     2  YesT       43   71.0)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.