2017-10-21 23 views
2

저는 np.nansum과 같은 기능을 사용하여 기존 데이터 프레임에서 하위 데이터 프레임을 만드는 데 도움을 찾고 있습니다. '댄'(t-2,3,4,6,7)의 합 널이 아닌 경우, 예를 들어팬더 크로스 탭 매트릭스 도트 nansum

dan ste bob 
t1 na 2 na 
t2 2 na 1 
t3 2 1 na 
t4 1 na 2 
t5 na 1 2 
t6 2 1 na 
t7 1 na 2 

: I는 널 (null) 열 합계의 행렬에이 테이블을 변환 할 '인트는'인트는 '단'이 아닌 null이 합이 4

dan ste bob 
dan 0 2 5 
ste 4 0 2 
bob 4 1 0 

어떤 아이디어되는 경우 2 '밥'이 5입니다?

미리 감사드립니다.

def nansum_matrix_create(df): 
    rows = [] 
    for col in list(df.columns.values): 

     col_sums = df[df[col] != 0].sum() 
     rows.append(col_sums) 

    return pd.DataFrame(rows, columns=df.columns, index=df.columns) 
+1

이것은 크로스 탭이 아니며, 내적 제품도 아니며, 실제로는 nansum도 아닙니다. –

답변

0

이 dataframe를 가정하면,이 기능을 사용하면 원하는 상당히 확대됨에있을 어떻게해야 열 많은 수를 가지고 있지 않습니다

나는 아래 매트의 기능의 수정 된 버전을 사용하여 끝났다. 나는 컬럼을 가로 질러 for 루프를 사용하여 이것을 구현 했으므로 그보다 더 뛰어난/고급 솔루션이있을 수 있습니다. 비 - 널 (null)이있는 곳

import pandas as pd 

# Initialise dataframe 
df = {"dan":[pd.np.nan,2,2,1,pd.np.nan,2,1], 
     "ste":[2,pd.np.nan,1,pd.np.nan,1,1,pd.np.nan], 
     "bob":[pd.np.nan,1,pd.np.nan,2,2,pd.np.nan,2]} 
df = pd.DataFrame(df)[["dan","ste","bob"]] 

def matrix_create(df): 
    rows = [] 
    for col in df.columns: 
     subvals, index = [], [] 
     for subcol in df.columns: 
      index.append(subcol) 
      if subcol == col: 
       subvals.append(0) 
      else: 
       subvals.append(df[~pd.isnull(df[col])][subcol].sum()) 

     rows.append(subvals) 

    return pd.DataFrame(rows,columns=df.columns,index=index) 

matrix_create(df) 
+0

감사합니다. Matt - 스크립트로 성능 문제가 발생했지만 약간 수정했고 이제는 훌륭하게 작동합니다! –

+0

데프 nansum_matrix_create (DF) 행 = []리스트에 대한 COL (df.columns.values) col_sums의 안양 = [! DF [COL = 0] .sum() rows.append (col_sums) return pd.DataFrame (rows, columns = df.columns, index = df.columns) –

1
  1. 사용 pd.DataFrame.notnull를 얻을 수 있습니다.
  2. 그런 다음 pd.DataFrame.dot을 사용하여 크로스 탭을 설정하십시오.
  3. 마지막으로 np.eye을 사용하여 대각선을 제로화하십시오.

    df.notnull().T.dot(df.fillna(0)) * (1 - np.eye(df.shape[1])) dan ste bob dan 0.0 2.0 5.0 ste 4.0 0.0 2.0 bob 4.0 1.0 0.0 

참고 :
나는 나의 값이 숫자했다 확인하기 위해 사용했다.

df = df.apply(pd.to_numeric, errors='coerce') 
+0

이것은 문제의 아름다운 해결책입니다! – Matt

+0

이 데이터를 테스트 할 때 열의 모든 셀에서 같은 합계를 계산했습니다. –

+0

''na ''문자열입니까? 아니면 값이 null입니까? 문자열 인 경우 내 대답의 **'note :'** 섹션에있는 코드를 사용해야합니다. 그렇지 않으면 실제 데이터의 일부를 볼 필요가 있습니다. – piRSquared