2017-11-04 1 views
2

행에 마지막 두 열만 조 변경하려고합니다.나머지 열을 열로 남기고 행에 몇 개의 열만 옮겨 놓습니다. - python

sample = {'ID' : [1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3], 
      'date' : [1,1,1,2,2,2,3,3,3,1,1,1,2,2,2,3,3,3,1,1,1,2,2,2,3,3,3], 
      'value' : [111,112,113,121,122,123,131,132,133,211,212,213,221,222,223,231,232,233,311,312,313,321,322,323,331,332,333] 
      } 
sample_df = pd.DataFrame(sample) 
sample_df 

는 기본적으로, 난 그냥 첫 번째 데이터의 마지막 3 열이 아닌 컬럼의 행에 있어야합니다 : 여기

sample = {'ID' : [1,1,1,2,2,2,3,3,3], 
      'date' : [1,2,3,1,2,3,1,2,3], 
      '1st hour' : [111,121,131,211,221,231,311,321,331], 
      '2nd hour' : [112,122,132,212,222,232,312,322,332], 
      '3rd hour' : [113,123,133,213,223,233,313,323,333] 
     } 
sample_df = pd.DataFrame(sample) 

sample_df 

내 출력이 어떻게해야 내 샘플입니다.

누구든지 나를 도와 줄 수 있다면 정말 좋을 것입니다. 미리 감사드립니다.

답변

3

사용 melt + sort_values :

df = sample_df.melt(id_vars=['ID','date']).drop('variable', 1).sort_values(['ID','date']) 
#old version of pandas < 0.20.0 
#df= pd.melt(sample_df, id_vars=['ID','date']).drop('variable', 1).sort_values(['ID','date']) 
print (df.head(10)) 
    ID date value 
0 1  1 111 
9 1  1 112 
18 1  1 113 
1 1  2 121 
10 1  2 122 
19 1  2 123 
2 1  3 131 
11 1  3 132 
20 1  3 133 
3 2  1 211 

또는 set_index + stack :

df = sample_df.set_index(['ID','date']) 
       .stack() 
       .reset_index(level=2, drop=True) 
       .reset_index(name='value') 
print (df.head(10)) 
    ID date value 
0 1  1 111 
1 1  1 112 
2 1  1 113 
3 1  2 121 
4 1  2 122 
5 1  2 123 
6 1  3 131 
7 1  3 132 
8 1  3 133 
9 2  1 211 
+0

정말 멋지다. 감사합니다 –

+0

그리고 난 그냥 ID와 날짜 덕분에 정렬 할 수 있습니다 –

+0

네, 끝났습니다. 편집 된 답변을 확인하십시오. – jezrael

2
sample_df.set_index(['ID','date']).stack().reset_index().drop('level_2',1).rename(columns={0:'value'}) 
Out[559]: 
    ID date value 
0 1  1 111 
1 1  1 112 
2 1  1 113 
3 1  2 121 
4 1  2 122 
5 1  2 123 
6 1  3 131 
7 1  3 132 
8 1  3 133 
9 2  1 211 
10 2  1 212 
11 2  1 213 
12 2  2 221 
13 2  2 222 
14 2  2 223 
15 2  3 231 
16 2  3 232 
17 2  3 233 
18 3  1 311 
19 3  1 312 
20 3  1 313 
21 3  2 321 
22 3  2 322 
23 3  2 323 
24 3  3 331 
25 3  3 332 
26 3  3 333 
+0

마음에 들지 않으면, 코드 plz을 통해 나를 걸을 수 있습니까? –

+0

@YunTaeHwang은 인덱스와 스택을 같은 값으로 설정합니다 :-) – Wen

1

도록 마지막 세 개의 열을 평평하게 될 수 있습니다이를 달성하기위한 파이썬 방법 :

>>> flatten = lambda l: [item for sublist in l for item in sublist] 
>>> sample_df = [[111,112,113],[121,122,123],[131,132,133]] 
>>> flatten(sample_df) 
[111,112,113,121,122,123,131,132,133] 

하지만 jezrael의 대답은 팬더 데이터 프레임을 사용하는 것이 더 나은 선택 일 수 있습니다.

관련 문제