복붙노트

[PYTHON] 팬더 데이터 프레임의 음수를 0으로 대체하는 방법

PYTHON

팬더 데이터 프레임의 음수를 0으로 대체하는 방법

나는 모든 DataFrame 음수를 0으로 대체하는 방법이 있는지 알고 싶습니다.

해결법

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

    1.모든 열이 숫자 인 경우 부울 식 색인을 사용할 수 있습니다.

    모든 열이 숫자 인 경우 부울 식 색인을 사용할 수 있습니다.

    In [1]: import pandas as pd
    
    In [2]: df = pd.DataFrame({'a': [0, -1, 2], 'b': [-3, 2, 1]})
    
    In [3]: df
    Out[3]: 
       a  b
    0  0 -3
    1 -1  2
    2  2  1
    
    In [4]: df[df < 0] = 0
    
    In [5]: df
    Out[5]: 
       a  b
    0  0  0
    1  0  2
    2  2  1
    

    보다 일반적인 경우이 대답은 private 메소드 인 _get_numeric_data를 보여줍니다.

    In [1]: import pandas as pd
    
    In [2]: df = pd.DataFrame({'a': [0, -1, 2], 'b': [-3, 2, 1],
                               'c': ['foo', 'goo', 'bar']})
    
    In [3]: df
    Out[3]: 
       a  b    c
    0  0 -3  foo
    1 -1  2  goo
    2  2  1  bar
    
    In [4]: num = df._get_numeric_data()
    
    In [5]: num[num < 0] = 0
    
    In [6]: df
    Out[6]: 
       a  b    c
    0  0  0  foo
    1  0  2  goo
    2  2  1  bar
    

    부울 인덱싱은 timedelta 유형을 사용하면 데이터 프레임 전체가 아닌 별도의 열에서 작동하는 것처럼 보입니다. 그렇게 할 수 있습니다.

    In [1]: import pandas as pd
    
    In [2]: df = pd.DataFrame({'a': pd.to_timedelta([0, -1, 2], 'd'),
       ...:                    'b': pd.to_timedelta([-3, 2, 1], 'd')})
    
    In [3]: df
    Out[3]: 
            a       b
    0  0 days -3 days
    1 -1 days  2 days
    2  2 days  1 days
    
    In [4]: for k, v in df.iteritems():
       ...:     v[v < 0] = 0
       ...:     
    
    In [5]: df
    Out[5]: 
           a      b
    0 0 days 0 days
    1 0 days 2 days
    2 2 days 1 days
    

    업데이트 : pd.Timedelta와의 비교는 전체 DataFrame에서 작동합니다.

    In [1]: import pandas as pd
    
    In [2]: df = pd.DataFrame({'a': pd.to_timedelta([0, -1, 2], 'd'),
       ...:                    'b': pd.to_timedelta([-3, 2, 1], 'd')})
    
    In [3]: df[df < pd.Timedelta(0)] = 0
    
    In [4]: df
    Out[4]: 
           a      b
    0 0 days 0 days
    1 0 days 2 days
    2 2 days 1 days
    
  2. ==============================

    2.이 작업을 수행하는 또 다른 간결한 방법은 pandas.DataFrame.clip입니다.

    이 작업을 수행하는 또 다른 간결한 방법은 pandas.DataFrame.clip입니다.

    예 :

    import pandas as pd
    
    In [20]: df = pd.DataFrame({'a': [-1, 100, -2]})
    
    In [21]: df
    Out[21]: 
         a
    0   -1
    1  100
    2   -2
    
    In [22]: df.clip(lower=0)
    Out[22]: 
         a
    0    0
    1  100
    2    0
    

    df.clip_lower (0)도 있습니다.

  3. ==============================

    3.아마 당신은 판다를 사용할 수 있습니다. (args)

    아마 당신은 판다를 사용할 수 있습니다. (args)

    data_frame = data_frame.where(data_frame < 0, 0)
    
  4. ==============================

    4.커다란 df (40m x 700m)를 다루는 경우, 열과 같은 것을 반복하여 훨씬 빠르게 그리고 메모리에 익숙해집니다.

    커다란 df (40m x 700m)를 다루는 경우, 열과 같은 것을 반복하여 훨씬 빠르게 그리고 메모리에 익숙해집니다.

    for col in df.columns:
        df[col][df[col] < 0] = 0
    
  5. from https://stackoverflow.com/questions/27759084/how-to-replace-negative-numbers-in-pandas-data-frame-by-zero by cc-by-sa and MIT license