2016-11-02 7 views
1

에 열을 결합 :처럼 데이터 프레임을 갖는 DataFrame

  • 요인/카테고리 열 ['a', 'b'] :

    import pandas 
    
    df = pandas.DataFrame({'a': [1, 2, 3], 'b': [9, 8, 7], 'c': [4, 5, 6]}) 
    df 
    

    enter image description here

    내가 가진 데이터 프레임을 가지고 싶습니다. 이 칼럼의 이름은 상관 없습니다.

  • ['a', 'b'] 요소에 따라 a 또는 b 열의 이전 값을 가진 열입니다. 이 칼럼의 이름은 상관 없습니다.
  • c 열 값과 이름을 유지하십시오 (실제 데이터 프레임에는 유지하고 싶은 여러 열이 있습니다).
  • 결과 데이터 프레임의 열 순서 나 인덱스의 일부 (또는 일부)가 인덱스로 설정되지 않아도 상관하지 않습니다.

    df['name_a'] = 'a' 
    df['name_b'] = 'b' 
    
    c0 = pandas.concat([df['name_a'], df['name_b']]) 
    c1 = pandas.concat([df['a'], df['b']]) 
    c2 = pandas.concat([df['c'], df['c']]) 
    
    newdf = pandas.concat([c0, c1, c2], axis=1) 
    newdf 
    

    enter image description here

    같은 결과를 얻을 수있는 더 나은 방법이 있나요 :

이것은 내가 좀하고 싶습니다 무엇의 예입니다? 그렇게 생각하면 아주 추합니다. 아마도 pandas 함수가 누락되어 코드를 훨씬 명확하고 이해하기 쉽게 만들 수 있습니까?

답변

1

난 당신이 melt 필요하다고 생각 :

print (pd.melt(df,id_vars='c', var_name='0', value_name='1')) 
    c 0 1 
0 4 a 1 
1 5 a 2 
2 6 a 3 
3 4 b 9 
4 5 b 8 
5 6 b 7 

sort_valuesstack 또 다른 솔루션 :

df1 = df.set_index('c').stack().reset_index().sort_values('level_1') 
df1.columns = ['c', '0','1'] 
print (df1) 
    c 0 1 
0 4 a 1 
2 5 a 2 
4 6 a 3 
1 4 b 9 
3 5 b 8 
5 6 b 7 

보다 일반적인 솔루션 - 필터 list comprehension을 사용 cols 변수에 ab을하지 않은 모든 컬럼 :

cols = [col for col in df.columns if col not in ['a','b']] 
print (cols) 
['c'] 

print (pd.melt(df,id_vars=cols, var_name='0', value_name='1')) 
    c 0 1 
0 4 a 1 
1 5 a 2 
2 6 a 3 
3 4 b 9 
4 5 b 8 
5 6 b 7 
01 다른 열을 g을 추가로 23,516,

샘플 : numpy.setdiff1d

df = pd.DataFrame({'a': [1, 2, 3], 
        'b': [9, 8, 7], 
        'c': [4, 5, 6], 
        'g': [0, 1, 7]}) 

print (df) 
    a b c g 
0 1 9 4 0 
1 2 8 5 1 
2 3 7 6 7 

cols = [col for col in df.columns if col not in ['a','b']] 
print (cols) 
['c', 'g'] 

빠른 솔루션 :

cols = np.setdiff1d(df.columns, ['a','b']).tolist() 
print (cols) 
['c', 'g'] 

print (pd.melt(df,id_vars=cols, var_name='0', value_name='1')) 
    c g 0 1 
0 4 0 a 1 
1 5 1 a 2 
2 6 7 a 3 
3 4 0 b 9 
4 5 1 b 8 
5 6 7 b 7 
+0

덕분에,이 꽤 좋아 보인다! 그러나 "* 실제 데이터 프레임에는 여러 개의 열이 있습니다."(즉, 많은 'c'열). 'c' 대신'a'와'b'를 매개 변수로 사용하는 방법이 있습니까? ('a'와'b'는 항상 2이지만 다른 이름을 가진'c' 칼럼이 많이 있습니다. 모든 것을 유지하고 싶습니다). – Peque

+0

확실 해요, 잠깐만 요. – jezrael

+0

내 대답을 확인하십시오. – jezrael

관련 문제