2016-09-15 2 views
-2

나는 아래에 df1을 가지고 있습니다. 보존을 위해 df2에 사본을 만듭니다 df1; 그 다음에 df3을 사용하여 df2을 계산합니다.데이터 프레임 팬더의 행에 가중치 적용

df2=df1.copy() 

내가 Weight(A) = Price(A)/Sum(row_Prices) 같은 무게를 계산하며 각 행에 대해 같은 가격은 내가 데이터의 3 개 라인을 얻을 아래 df2로 돌아가려면, 가격, 성병 및 무게 행입니다. 나는 또한 행을 통해 표준을 계산하고 싶습니다 그리고 나는 그것이 비슷한 형태라고 생각합니다.

나는 가중치를 가져온 다음 df3을 인쇄하려면이

df3 = df2.iloc[1:,1:].div(df2.iloc[1:,1:].sum(axis=1), axis=0) 

을 시도했지만 작동하지 않습니다.

각 날짜마다 2 행을 얻으려고 시도했지만 스태킹 시도는 .stack()입니다.하지만 잘못하고 있습니다. 도움! 당신은

     A  B  C  D  E 
2006-04-27 00:00:00          
2006-04-28 00:00:00 69.62 69.62 6.518 65.09 69.62 
2006-05-01 00:00:00 71.5 71.5 6.522 65.16 71.5 
2006-05-02 00:00:00 72.34 72.34 6.669 66.55 72.34 
2006-05-03 00:00:00 70.22 70.22 6.662 66.46 70.22 
2006-05-04 00:00:00 68.32 68.32 6.758 67.48 68.32 
2006-05-05 00:00:00  68  68 6.805 67.99  68 
2006-05-08 00:00:00 67.88 67.88 6.768 67.56 67.88 

나는 같은 잘 OUPUT하는 데 싶습니다 감사 :

      A  B  C  D  E 
2006-04-27 00:00:00 

2006-04-28 00:00:00          
      price  69.62 69.62 6.518 65.09 69.62 
      weight 
      std 
2006-05-01 00:00:00 
      price   71.5 71.5 6.522 65.16 71.5 
      weight 
      std 
2006-05-02 00:00:00 
      price  72.34 72.34 6.669 66.55 72.34 
      weight 
      std 
+0

예. 여기 오타입니다 .df1의 사본을 얻습니다. thnks 그래도 – uniXVanXcel

+1

어떻게'df1'을 얻었습니까? 귀하의 인덱스 이름 :'2006-04-27 23 : 55 : 00' 이상하게 보입니다 ... 당신은'print (df2)'와'print (df2.index)'의 출력을 게시 할 수 있습니까 – MaxU

+0

상단에 다른 값 집합이있는 행을 추가하십시오. 그러나 여기에 나와있는 질문에 대해서는 그다지 관련이 없습니다. 나는 혼란을 피하기 위해 그것을 테이블로 바꾸었다. 감사합니다 – uniXVanXcel

답변

1

지금까지 내가 아는 한, 당신이 시도하고있는 무슨 달성 할 한 줄 - 빠른 - 및 - 더러운 방법이 없습니다 할 것. 측면으로

2006-04-28 price  69.62  69.62  6.518  65.09  69.62 
      std  27.7829 27.7829 27.7829 27.7829 27.7829 
      weight 0.248228 0.248228 0.0232397 0.232076 0.248228 
2006-05-01 price  71.5  71.5  6.522  65.16  71.5 
      std  28.4828 28.4828 28.4828 28.4828 28.4828 
      weight 0.249841 0.249841 0.0227897 0.227687 0.249841 
2006-05-02 price  72.34  72.34  6.669  66.55  72.34 
      std  28.8308 28.8308 28.8308 28.8308 28.8308 
      weight 0.249243 0.249243 0.0229776 0.229294 0.249243 
2006-05-03 price  70.22  70.22  6.662  66.46  70.22 
      std  28.0509 28.0509 28.0509 28.0509 28.0509 
      weight 0.247443 0.247443 0.0234758 0.234194 0.247443 
2006-05-04 price  68.32  68.32  6.758  67.48  68.32 
      std  27.4399 27.4399 27.4399 27.4399 27.4399 
      weight 0.244701 0.244701 0.024205 0.241692 0.244701 
2006-05-05 price   68  68  6.805  67.99  68 
      std  27.3661 27.3661 27.3661 27.3661 27.3661 
      weight 0.243907 0.243907 0.0244086 0.243871 0.243907 
2006-05-08 price  67.88  67.88  6.768  67.56  67.88 
      std  27.2947 27.2947 27.2947 27.2947 27.2947 
      weight 0.244201 0.244201 0.0243481 0.24305 0.244201 

:

# Making weight/std DataFrames 
cols = list('ABCDE') 
weight = pd.DataFrame([df[col]/df.sum(axis=1) for col in df], index=cols).T 
std = pd.DataFrame([df.std(axis=1) for col in df], index=cols).T 

# Making MultiIndex DataFrame 
mindex = pd.MultiIndex.from_product([['price', 'weight', 'std'], df.index]) 
new_df = pd.DataFrame(index=mindex, columns=cols) 

# Inserting data 
new_df.ix['price'] = df.values 
new_df.ix['weight'] = weight.values 
new_df.ix['std'] = std.values 

# Swapping levels 
new_df = new_df.swaplevel(0, 1).sort_index() 

new_df을 결과하는 것은 다음과 같은 다소 같아야합니다 당신은 모든 데이터를 계산 한 후 다단계 인덱스를 사용하는 DataFrame에 모두 병합해야 참고로, 어떤 종류의 표준을 계산할 것인지 확신 할 수 없으므로 행렬 가격 std (각 행의 단일/반복 값)로 가정했습니다.

+0

우수 감사합니다 !! – uniXVanXcel

+0

한 가지 문제는 실제로 인덱스 된 첫 번째 행에 값 형식의 문자열이 있다는 것입니다. 2006-04-27 00:00:00 그래서 문자열과 수레를 비교하려고 할 때 weight 및 std 함수가 작동하지 않습니다. int 또는 float 만있는 행을 필터링하는 방법을 알고 있습니까? – uniXVanXcel

+0

나는 다음과 같은 결과를 얻습니다 : TypeError : 'Timestamp'유형을 'str'유형과 비교할 수 없습니다. – uniXVanXcel

관련 문제