tsv 데이터 파일 양식을 바꾸고 싶습니다. 특정 컬럼의 값을 컬럼명으로

조회수 547회

파일 양식이 예를들면:


파일명: test

이름:4개

샘플:4개

이름 위치 위치2 샘플 1 2 3

철수 7 334 A a a 0.1

영희 7 333 A a g 0.3

바둑 9 334 A a a 0.1

얼룩 8 330 A c a 0.2

철수 7 334 B c c 0.2

영희 7 333 B t a 0.1

바둑 9 334 B a c 0.3

얼룩 8 330 B c c 0.1

철수 7 334 C c t 0.2

영희 7 333 C t t 0.1

바둑 9 334 C a c 0.3

얼룩 8 330 C a t 0.1


이런식으로 되어있는걸


이름 위치 위치2 A B C

영희 7 333 ag ta tt

철수 7 334 aa cc ct

얼룩 8 330 ca cc at

바둑 9 334 aa ac at


이런식의 양식으로 바꾸고 싶습니다.

파일은 탭으로 구분되어 있습니다.

A B에서 결측치는 - - 이런식으로 나와있는데 이건 NN으로 바꾸고 싶습니다.

1 답변

  • unstack 이란 게 있습니다.

    import pandas as pd
    from io import StringIO
    
    
    f = """파일명:   test
    이름:4개
    샘플:4개
    이름  위치  위치2 샘플  1   2   3
    철수  7   334 A   a   a   0.1
    영희  7   333 A   a   g   0.3
    바둑  9   334 A   a   a   0.1
    얼룩  8   330 A   c   a   0.2
    철수  7   334 B   c   c   0.2
    영희  7   333 B   t   a   0.1
    바둑  9   334 B   a   c   0.3
    얼룩  8   330 B   c   c   0.1
    철수  7   334 C   c   t   0.2
    영희  7   333 C   t   t   0.1
    바둑  9   334 C   a   c   0.3
    얼룩  8   330 C   a   t   0.1"""
    
    
    df = pd.read_csv(StringIO(f), skiprows=3, sep="\t")
    
    print(df.to_markdown())
    
    """
    |    | 이름   |   위치 |   위치2 | 샘플   | 1   | 2   |   3 |
    |---:|:-------|-------:|--------:|:-------|:----|:----|----:|
    |  0 | 철수   |      7 |     334 | A      | a   | a   | 0.1 |
    |  1 | 영희   |      7 |     333 | A      | a   | g   | 0.3 |
    |  2 | 바둑   |      9 |     334 | A      | a   | a   | 0.1 |
    |  3 | 얼룩   |      8 |     330 | A      | c   | a   | 0.2 |
    |  4 | 철수   |      7 |     334 | B      | c   | c   | 0.2 |
    |  5 | 영희   |      7 |     333 | B      | t   | a   | 0.1 |
    |  6 | 바둑   |      9 |     334 | B      | a   | c   | 0.3 |
    |  7 | 얼룩   |      8 |     330 | B      | c   | c   | 0.1 |
    |  8 | 철수   |      7 |     334 | C      | c   | t   | 0.2 |
    |  9 | 영희   |      7 |     333 | C      | t   | t   | 0.1 |
    | 10 | 바둑   |      9 |     334 | C      | a   | c   | 0.3 |
    | 11 | 얼룩   |      8 |     330 | C      | a   | t   | 0.1 |
    """
    
    df["1_2"] = df["1"] + df["2"]
    
    print(df.to_markdown())
    """
    |    | 이름   |   위치 |   위치2 | 샘플   | 1   | 2   |   3 | 1_2   |
    |---:|:-------|-------:|--------:|:-------|:----|:----|----:|:------|
    |  0 | 철수   |      7 |     334 | A      | a   | a   | 0.1 | aa    |
    |  1 | 영희   |      7 |     333 | A      | a   | g   | 0.3 | ag    |
    |  2 | 바둑   |      9 |     334 | A      | a   | a   | 0.1 | aa    |
    |  3 | 얼룩   |      8 |     330 | A      | c   | a   | 0.2 | ca    |
    |  4 | 철수   |      7 |     334 | B      | c   | c   | 0.2 | cc    |
    |  5 | 영희   |      7 |     333 | B      | t   | a   | 0.1 | ta    |
    |  6 | 바둑   |      9 |     334 | B      | a   | c   | 0.3 | ac    |
    |  7 | 얼룩   |      8 |     330 | B      | c   | c   | 0.1 | cc    |
    |  8 | 철수   |      7 |     334 | C      | c   | t   | 0.2 | ct    |
    |  9 | 영희   |      7 |     333 | C      | t   | t   | 0.1 | tt    |
    | 10 | 바둑   |      9 |     334 | C      | a   | c   | 0.3 | ac    |
    | 11 | 얼룩   |      8 |     330 | C      | a   | t   | 0.1 | at    |
    """
    
    df1 = df[["이름", "위치", "위치2", "샘플", "1_2"]].set_index(["이름", "위치", "위치2", "샘플"])
    
    print(df1.to_markdown())
    """
    |                       | 1_2   |
    |:----------------------|:------|
    | ('철수', 7, 334, 'A') | aa    |
    | ('영희', 7, 333, 'A') | ag    |
    | ('바둑', 9, 334, 'A') | aa    |
    | ('얼룩', 8, 330, 'A') | ca    |
    | ('철수', 7, 334, 'B') | cc    |
    | ('영희', 7, 333, 'B') | ta    |
    | ('바둑', 9, 334, 'B') | ac    |
    | ('얼룩', 8, 330, 'B') | cc    |
    | ('철수', 7, 334, 'C') | ct    |
    | ('영희', 7, 333, 'C') | tt    |
    | ('바둑', 9, 334, 'C') | ac    |
    | ('얼룩', 8, 330, 'C') | at    |
    """
    df2 = df1.unstack("샘플").droplevel(0, axis=1)
    
    print(df2.to_markdown())
    """
    |                  | A   | B   | C   |
    |:-----------------|:----|:----|:----|
    | ('바둑', 9, 334) | aa  | ac  | ac  |
    | ('얼룩', 8, 330) | ca  | cc  | at  |
    | ('영희', 7, 333) | ag  | ta  | tt  |
    | ('철수', 7, 334) | aa  | cc  | ct  |
    """
    
    df2 = df2.reset_index()
    
    print(df2.to_markdown())
    """
    |    | 이름   |   위치 |   위치2 | A   | B   | C   |
    |---:|:-------|-------:|--------:|:----|:----|:----|
    |  0 | 바둑   |      9 |     334 | aa  | ac  | ac  |
    |  1 | 얼룩   |      8 |     330 | ca  | cc  | at  |
    |  2 | 영희   |      7 |     333 | ag  | ta  | tt  |
    |  3 | 철수   |      7 |     334 | aa  | cc  | ct  |
    """
    
    
    df2.to_csv("result.csv", sep="\t", index=None)
    """
    이름  위치  위치2 A   B   C
    바둑  9   334 aa  ac  ac
    얼룩  8   330 ca  cc  at
    영희  7   333 ag  ta  tt
    철수  7   334 aa  cc  ct
    """
    
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)