2016-08-09 8 views
1

이름에 I는 해당 메트릭 주파수 관한 다음 구조GROUPBY/열

idx value Formula_name 
0 123456789  100  Frequency No4 
1 123456789  150  Frequency No25 
2 123456789  125  Frequency No27 
3 123456789  0.2  Power Level No4 
4 123456789  0.5  Power Level No25 
5 123456789  -1.0 Power Level No27 
6 123456789  32  SNR No4 
7 123456789  35  SNR No25 
8 123456789  37  SNR No27 
9 111222333  ... 

따라서 유일한 방법와 dataframe가 언 스택 주파수의 번호로된다. 나는 가능한 범위 (25 MHz 단위로 100에서 200 MHz까지)를 알고 있지만, 어떤 주파수 (또는 얼마나 많은)가 데이터에 나타나지 않으며 주파수를 미터법과 관련시키는 데 사용되는 "숫자"도 아닙니다.

나는 그와 유사한 dataframe에 도착 싶습니다 : 하나를 들어

    SNR      Power Level 
    idx   100 125 150 175 200 100 125 150 175 200 
0 123456789  32 37 35 NaN NaN 0.2 -1.0 0.5 NaN NaN 
1 111222333  ... 

메트릭, 나는 두 dataframes, 주파수 하나, 메트릭 하나를 생성하고, 번호를 통합 :

df.groupby(['idx','value_y']).first()[['value_x']].unstack() 

이 충족 하나 작동합니다

 idx   Formula_x value_x number Formula_y value_y 
0 123456789 SNR  32  4  frequency 100 
1 123456789 SNR  35  25  frequency 150 

그럼 난 dataframe을 언 스택 것 ric,하지만 나는 더 많은 메트릭스에 그것을 어떻게 적용 할 수 있는지를 알지 못하고 컬럼에서 멀티 인덱스를 사용하여 접근한다.

모든 아이디어와 제안을 환영합니다.

답변

2

당신은 사용할 수 있습니다

print (df) 
     idx value  Formula_name 
0 123456789 100.0  Frequency No4 
1 123456789 150.0 Frequency No25 
2 123456789 125.0 Frequency No27 
3 123456789 0.2 Power Level No4 
4 123456789 0.5 Power Level No25 
5 123456789 -1.0 Power Level No27 
6 123456789 32.0   SNR No4 
7 123456789 35.0   SNR No25 
8 123456789 37.0   SNR No27 

#create new columns from Formula_name 
df[['a','b']] = df.Formula_name.str.rsplit(n=1, expand=True) 

#maping by Series column b - from No4, No25 to numbers 100,150... 
maps = df[df.a == 'Frequency'].set_index('b')['value'].astype(int) 
df['b'] = df.b.map(maps) 

#remove rows where is Frequency, remove column Formula_name 
df1 = df[df.a != 'Frequency'].drop('Formula_name', axis=1) 
print (df1) 
     idx value   a b 
3 123456789 0.2 Power Level 100 
4 123456789 0.5 Power Level 150 
5 123456789 -1.0 Power Level 125 
6 123456789 32.0   SNR 100 
7 123456789 35.0   SNR 150 
8 123456789 37.0   SNR 125 

두 솔루션 - unstackpivot_table와 함께.

df2 = df1.set_index(['idx','a', 'b']).unstack([1,2]) 
df2.columns = df2.columns.droplevel(0) 
df2 = df2.rename_axis(None).rename_axis([None, None], axis=1) 
print (df2) 
      Power Level    SNR    
        100 150 125 100 150 125 
123456789   0.2 0.5 -1.0 32.0 35.0 37.0 

df3 = df1.pivot_table(index='idx', columns=['a','b'], values='value') 
df3 = df3.rename_axis(None).rename_axis([None, None], axis=1) 
print (df3) 
      Power Level    SNR    
        100 125 150 100 125 150 
123456789   0.2 -1.0 0.5 32.0 37.0 35.0 
+0

감사합니다. 이것은 트릭을했다. 'map' 대신에'merge'를 사용했지만, 여러 idx를 사용하면 맵이 모호했습니다. – WilliamEllisWebb

+0

예, 다른 옵션입니다, 수락 해 주셔서 감사합니다, 행운을 빈다 (+1 질문, 어제를 잊어 버려) – jezrael