programing

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

sourcejob 2023. 6. 18. 13:07
반응형

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

저는 Python의 Pandas DataFrame과 함께 일하고 있습니다.

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

모든 NaN을 교체해야 합니다.Temp_Rating의 값이 있는 열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

부울 선택을 수행하면 한 번에 이 열 중 하나만 선택할 수 있습니다.문제는 만약 제가 그들과 함께 하려고 한다면, 저는 올바른 질서를 유지하면서 이것을 할 수 없다는 것입니다.

어떻게 해야만 찾을 수 있습니까?Temp_Rating와의 말다툼.NaNs 및 그 값들을 같은 행의 값으로 대체합니다.Farheit칼럼?

데이터 프레임이 다음 위치에 있다고 가정합니다.df:

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

먼저 모든 항목 교체NaN해당 값을 갖는 값df.Farheit삭제'Farheit'기둥.그런 다음 열 이름을 바꿉니다.결과는 다음과 같습니다.DataFrame:

resulting DataFrame

위에서 언급한 해결책은 저에게 효과가 없었습니다.제가 사용한 방법은 다음과 같습니다.

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

@조나단의 대답은 좋지만, 과잉 살상은 그냥 사용하세요.pop:

df['Temp_Rating'] = df['Temp_Rating'].fillna(df.pop('Farheit'))

이 문제를 해결하기 위한 또 다른 방법은,

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)

다음과 같은 경우 값을 대체하는 를 사용할 수도 있습니다.Temp_Rating열에 의한 NaN임Farheit:

df['Temp_Rating'] = df['Temp_Rating'].mask(df['Temp_Rating'].isna(), df['Farheit'])

승인된 답변은 다음을 사용합니다.fillna()두 데이터 프레임이 인덱스를 공유하는 결측값을 채웁니다.여기서 잘 설명했듯이, 당신은 다음을 사용할 수 있습니다.combine_first두 데이터 프레임의 인덱스가 일치하지 않는 상황에 대한 결측값, 행 및 인덱스 값을 입력합니다.

df.Col1 = df.Col1.fillna(df.Col2) #fill in missing values if indices match

#or 
df.Col1 = df.Col1.combine_first(df.Col2) #fill in values, rows, and indices

매우 늦게 왔지만, 비슷한 문제를 발견했고 이렇게 해결했습니다. 저에게는 조금 더 간결하게 보였습니다.비슷한 상황에 있는 모든 사람들에게 효과가 있기를 바랍니다.

def function_a (row):
if row['Temp_Rating'] is None : 
    val = print(row['Farheit'])
    return val
 df['Temp_Rating'] = df.apply(function_a, axis=1)
 df1= df.drop([Farheit], axis=1)

언급URL : https://stackoverflow.com/questions/29177498/python-pandas-replace-nan-in-one-column-with-value-from-corresponding-row-of-sec

반응형