복붙노트

[PYTHON] 팬더 : 두 개의 데이터 프레임을 요소로 나누는 것

PYTHON

팬더 : 두 개의 데이터 프레임을 요소로 나누는 것

두 판다 (Pandas) 데이터 프레임 간의 요소 곱셈 (Element Multiplication)을 수행하는 방법을 알고 있습니다. 그러나 두 데이터 프레임의 크기가 호환되지 않으면 상황이 더 복잡해집니다. 예를 들어 df * df2 이하는 간단하지만 df * df3은 문제입니다.

df = pd.DataFrame({'col1' : [1.0] * 5, 
                   'col2' : [2.0] * 5, 
                   'col3' : [3.0] * 5 }, index = range(1,6),)
df2 = pd.DataFrame({'col1' : [10.0] * 5, 
                    'col2' : [100.0] * 5, 
                    'col3' : [1000.0] * 5 }, index = range(1,6),)
df3 = pd.DataFrame({'col1' : [0.1] * 5}, index = range(1,6),)

df.mul(df2, 1) # element by element multiplication no problems

df.mul(df3, 1) # df(row*col) is not equal to df3(row*col)
   col1  col2  col3
1   0.1   NaN   NaN
2   0.1   NaN   NaN
3   0.1   NaN   NaN
4   0.1   NaN   NaN
5   0.1   NaN   NaN

위의 상황에서 어떻게 df의 모든 열에 df3.col1을 곱할 수 있습니까?

내 시도 : df3.col1 len (df.columns.values) 시간을 복제하여 df와 동일한 차원의 데이터 프레임을 얻으려고했습니다.

df3 = pd.DataFrame([df3.col1 for n in range(len(df.columns.values)) ])
df3
        1    2    3    4    5
col1  0.1  0.1  0.1  0.1  0.1
col1  0.1  0.1  0.1  0.1  0.1
col1  0.1  0.1  0.1  0.1  0.1

그러나 이것은 차원 3 * 5의 데이터 프레임을 생성하지만 5 * 3 이후입니다. 나는 내가 필요로하는 것을 얻기 위해 df3.T ()로 트랜스 포스를 취할 수 있다는 것을 알고 있지만 이것이 가장 빠르다고 생각하지 않는다.

해결법

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

    1.

    In [161]: pd.DataFrame(df.values*df2.values, columns=df.columns, index=df.index)
    Out[161]: 
       col1  col2  col3
    1    10   200  3000
    2    10   200  3000
    3    10   200  3000
    4    10   200  3000
    5    10   200  3000
    
  2. ==============================

    2.이렇게하는 더 간단한 방법은 유지하려는 데이터 형식의 데이터 프레임을 다른 데이터 형식의 값 (즉, numpy 배열)에 곱하는 것입니다.

    이렇게하는 더 간단한 방법은 유지하려는 데이터 형식의 데이터 프레임을 다른 데이터 형식의 값 (즉, numpy 배열)에 곱하는 것입니다.

    In [63]: df * df2.values
    Out[63]: 
       col1  col2  col3
    1    10   200  3000
    2    10   200  3000
    3    10   200  3000
    4    10   200  3000
    5    10   200  3000
    

    이 방법으로 새로운 데이터 프레임의 모든 보일러 플레이트를 작성할 필요가 없습니다.

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

    3.이것은 나를 위해 작동합니다 :

    이것은 나를 위해 작동합니다 :

    mul = df.mul(df3.c, axis=0)
    

    또는, 대신에 빼기 (나누기)를 원할 때 :

    sub = df.sub(df3.c, axis=0)
    div = df.div(df3.c, axis=0)
    

    df (df : df.iloc [0] [ 'col2'] = np.nan)에 적용하면

  4. ==============================

    4.또 다른 방법은 열의 목록을 만들고 그들을 가입시키는 것입니다.

    또 다른 방법은 열의 목록을 만들고 그들을 가입시키는 것입니다.

    cols = [pd.DataFrame(df[col] * df3.col1, columns=[col]) for col in df]
    mul = cols[0].join(cols[1:])
    
  5. ==============================

    5.팬더 방송 속성을 활용하려면 곱셈을 사용할 수 있습니다.

    팬더 방송 속성을 활용하려면 곱셈을 사용할 수 있습니다.

    df.multiply(df3['col1'], axis=0)
    
  6. from https://stackoverflow.com/questions/21022865/pandas-elementwise-multiplication-of-two-dataframes by cc-by-sa and MIT license