2016-06-23 3 views
3

현재 하나의 panadas DataFrame 행을 여러 개의 약간 변경된 행으로 분할하는 효율적인 방법을 찾으려고합니다. 이러한 구조를 상상 :팬더가있는 DataFrame 행을 분할하는 중

A C1 C2 C3 C4 
1 a b c a 
2 b a e b a 
3 g c 
4 d e 

을 나는 그런 구조와 끝까지하려는 : 지금까지 내가 루프를 사용하고

A C 
1 a b 
2 a c 
3 a a 
4 b a 
5 b e 
6 b b 
7 b a 
8 g c 
9 d e 
10 d e 

과 같은 사전 (DF 내 DataFrame입니다) 작성 : 불행히도이 접근법은 극히 느립니다. 지금까지 팬더로 작업 한 결과, 실행 시간 만 사용하면 크게 향상 될 수 있지만,이 경우를 더 빠르게 만드는 방법을 찾는 데는 많은 경험이 없습니다.

누군가가 조언을 할 수 있습니까?이 속도를 높이려면 어떻게해야합니까?

답변

3

이 시도 :

In [10]: pd.melt(df, id_vars='A', value_vars=['C1','C2','C3','C4']) 
Out[10]: 
    A variable value 
0 a  C1  b 
1 b  C1  a 
2 g  C1  c 
3 d  C1  e 
4 a  C2  c 
5 b  C2  e 
6 g  C2 NaN 
7 d  C2 NaN 
8 a  C3  a 
9 b  C3  b 
10 g  C3 NaN 
11 d  C3 NaN 
12 a  C4 NaN 
13 b  C4  a 
14 g  C4 NaN 
15 d  C4 NaN 

당신이 NaN의 제거하려면 :

In [15]: pd.melt(df, id_vars='A', value_vars=['C1','C2','C3','C4'], value_name='C')[['A','C']].dropna() 
Out[15]: 
    A C 
0 a b 
1 b a 
2 g c 
3 d e 
4 a c 
5 b e 
8 a a 
9 b b 
13 b a 

동일하지만, 동적으로 C* 열을 선택 :

In [21]: (pd.melt(df, id_vars='A', 
    ....:   value_vars=df.filter(like='C').columns.tolist(), 
    ....:   value_name='C')[['A','C']] 
    ....: .dropna() 
    ....:) 
Out[21]: 
    A C 
0 a b 
1 b a 
2 g c 
3 d e 
4 a c 
5 b e 
8 a a 
9 b b 
13 b a 
+0

을 주셔서 대단히 감사합니다 좋은 대답. 나는 모든'C * '컬럼을 선택하기위한 접근법을 만들었습니다 : pd.melt (df, id_vars ='A ', value_vars = list (df.columns [1 :]), value_name ='C ' 'A', 'C']]. dropna()'. 그것은 내가 생각하기에보다 보편적 인 접근법이다. – sebap123

+0

@ sebap123, 예, 더 좋아 보이지만이 열 집합에 대해서는 작동하지 않습니다 :'[ 'C1', 'A', C2 ', C3', ...] – MaxU

+0

전적으로 동의합니다. 그러나 이런 경우에는 아마도'list (df.columns [0]) + list (df.columns [2 :])'를 할 것입니다. – sebap123

관련 문제