복붙노트

[PYTHON] Pandas Dataframe : NaN을 행 평균으로 바꾸기

PYTHON

Pandas Dataframe : NaN을 행 평균으로 바꾸기

나는 판다를 배우려고 노력하고있다. 그러나 나는 다음과 같이 어리 석다. NaN을 행 평균과 데이터 프레임으로 대체하고 싶습니다. 따라서 df.fillna (df.mean (axis = 1))와 같은 것이 작동해야하지만, 어떤 이유로 그것이 나를 위해 실패합니다. 제발 아무것도 놓치고 있어요, 내가 잘못하고있는 게 뭔가요? 그것은 구현되지 않았기 때문입니다. 여기 링크를 참조하십시오.

import pandas as pd
import numpy as np
​
pd.__version__
Out[44]:
'0.15.2'

In [45]:
df = pd.DataFrame()
df['c1'] = [1, 2, 3]
df['c2'] = [4, 5, 6]
df['c3'] = [7, np.nan, 9]
df

Out[45]:
    c1  c2  c3
0   1   4   7
1   2   5   NaN
2   3   6   9

In [46]:  
df.fillna(df.mean(axis=1)) 

Out[46]:
    c1  c2  c3
0   1   4   7
1   2   5   NaN
2   3   6   9

그러나 이것과 같은 것은 잘 작동하는 것처럼 보입니다.

df.fillna(df.mean(axis=0)) 

Out[47]:
    c1  c2  c3
0   1   4   7
1   2   5   8
2   3   6   9

해결법

  1. ==============================

    1.주석으로 fillna에 대한 축 인수는 NotImplemented입니다.

    주석으로 fillna에 대한 축 인수는 NotImplemented입니다.

    df.fillna(df.mean(axis=1), axis=1)
    

    참고 : n 번째 행 평균으로 n 번째 열을 채우고 싶지 않으므로 여기에서 중요합니다.

    지금은 다음을 반복해야합니다.

    In [11]: m = df.mean(axis=1)
             for i, col in enumerate(df):
                 # using i allows for duplicate columns
                 # inplace *may* not always work here, so IMO the next line is preferred
                 # df.iloc[:, i].fillna(m, inplace=True)
                 df.iloc[:, i] = df.iloc[:, i].fillna(m)
    
    In [12]: df
    Out[12]:
       c1  c2   c3
    0   1   4  7.0
    1   2   5  3.5
    2   3   6  9.0
    

    대체 방법은 트랜스 포즈를 한 다음 트랜스 포 더를하는 것이 더 효율적일 수 있습니다 ...

    df.T.fillna(df.mean(axis=1)).T
    
  2. ==============================

    2.대안으로, 다음과 같은 람다 식으로 적용을 사용할 수도 있습니다 :

    대안으로, 다음과 같은 람다 식으로 적용을 사용할 수도 있습니다 :

    df.apply(lambda row: row.fillna(row.mean()), axis=1)
    

    항복

        c1   c2   c3
    0  1.0  4.0  7.0
    1  2.0  5.0  3.5
    2  3.0  6.0  9.0
    
  3. from https://stackoverflow.com/questions/33058590/pandas-dataframe-replacing-nan-with-row-average by cc-by-sa and MIT license