2016-06-24 5 views
1

데이터 프레임 열을 행으로 변환하는 방법을 찾고 있습니다.pandas dataframe 열을 행으로 변환합니다.

mylist= [['xx'], [None, 'yy'], ['xx', None], ['xx',None],['xx','yy']] 

pd.DataFrame(mylist,index=['A','B','C','D','E'],columns=['Col1','Col2']) 

입력 DataFrame : 다음은 내 예를 들어 dataframe입니다

나는 dataframe에서 별도의 행으로 내 열을 분할 할
------------------- 
Ind | Col1 | Col2 | 
------------------- 
A | xx | None | 
B | None | yy | 
C | xx | None | 
D | xx | None | 
E | xx | yy | 
------------------- 

. 아래는 원하는 출력이 어떻게 보이는지입니다. 누구나 다음을 달성하는 방법을 제안 할 수 있습니까?

원하는 dataframe :에

------------------------ 
Ind | Values | Columns | 
------------------------ 
A | xx  | Col1 | 
B | yy  | Col2 | 
C | xx  | Col1 | 
D | xx  | Col1 | 
E | xx  | Col1 | 
E | xx  | Col2 | 
------------------------ 

감사합니다,
Rtut

답변

3

또 다른 옵션은 사용하는 것입니다 melt :

longDf = pd.melt(df.reset_index(), id_vars=['index'], var_name=['Columns']) 
longDf[pd.notnull(longDf.value)] 

    index Columns value 
0 A Col1 xx 
2 C Col1 xx 
3 D Col1 xx 
4 E Col1 xx 
6 B Col2 yy 
9 E Col2 yy 
+0

이것은 최고입니다! – bernie

+0

@bernie 감사합니다. 'stack()'또한 그것을 수행하는 좋은 방법이다. – Psidom

2
df = pd.DataFrame(mylist,index=['A','B','C','D','E'],columns=['Col1','Col2']) 
# rotate df 
stacked_df = pd.DataFrame(df.stack().reset_index()) 
# name columns 
stacked_df.columns = ['Ind','Columns','Values'] 
# reorder columns 
reordered_df = pd.DataFrame(stacked_df,columns=['Ind','Values','Columns']) 

결과 :

>>> reordered_df 
    Ind Values Columns 
0 A  xx Col1 
1 B  yy Col2 
2 C  xx Col1 
3 D  xx Col1 
4 E  xx Col1 
5 E  yy Col2 
1

두 값의 경우 첫 번째 값만을 원하는 것처럼 보입니다. 귀하의 예에서 마지막 행).

두 개의 값이 모두있는 경우 loc을 사용하여 두 번째 값을 없음으로 설정할 수 있습니다.

df.loc[(df.Col1.notnull()) & (df.Col2.notnull()), 'Col2'] = None 

다음은 melt입니다.

>>> pd.melt(df.reset_index(), id_vars='index', var_name='Columns', value_name='Values' 
      ).dropna().set_index('index')[['Values', 'Columns']] 

     Values Columns 
index    
A   xx Col1 
C   xx Col1 
D   xx Col1 
E   xx Col1 
B   yy Col2 
관련 문제