파이선 데이터 분석 코드 질문 올립니다. List 의 각 값을 if loop 안에 어떻게 사용할 수 있을까요?

extremesonic의 이미지

안녕하세요. 제가 코딩을 해본적이 없는 상황에서, 초보인 제가 생업으로 인해 급히 혼자 파이선으로 코딩 하던 중에 어려운 부분에 부딪혀 이렇게 질문을 드리고자 합니다.
일단 데이터는 이렇게 생겼습니다.

 1 2 2 244 263 0         0.936         0.930         0.934         0.921         3.820         0.000         1.570
 2 4 4 215 172 305 33 0         0.945         0.942         0.937         0.580         3.687         0.000         1.410
 3 4 4 344 279 377 1945 0         0.933         0.915         0.907         0.921         3.839         0.000         1.437
....<code>
 
총 20405 라인인데, 4081 줄 마다 똑같은 포맷이 반복되는 데이터 셋입니다. 총 5개의 데이터 셋이 있는 셈이죠. 여기서 
 
1) 일단 데이터를 다 읽어서 컬럼별로 분리한 뒤에, 2번째 컬럼이 2 이면 그 때의 4번째 5번째 숫자들을 읽습니다. 그 뒤에 1번 컬럼이 그 4번째, 5번째 숫자인 줄로 가서 그 때의 2번째 컬럼 값을 체크 합니다. 
예를들어 지금 첫 줄을 보시면 두번째 값이 2이므로, 244 와 263을 체크하고, 그러고 바로 첫번째 컬럼이 244, 263 인 줄로 가는겁니다. 1번째 컬럼 기준으로 sort 되어있기 때문에 244번쨰, 263번째 줄을 체크한다고 봐도 무방합니다. 
 
2) 그 244번째, 263번째 줄을 체크하는데, 그 줄의 2번째 값이 둘 다 4이다, 그러면 첫번째 줄로 돌아와서 첫번째 줄의 두번째 컬럼 값 2를 5로 바꿔줍니다. 
 
3) 그리고 두번째 컬럼 값이 4인 경우, 역시 4번째 5번째 값을 체크를 합니다. 그리고 똑같이 그 줄로 갑니다. 예를 들어 저 데이터의 2번째 줄에서는 215 번째 줄, 그리고 172 번째 줄을 체크를 하면 되겠죠. 그리고 똑같이 그 두 줄의 2번째 컬럼 값을 체크 합니다. 그래서 그 2개의 2번째 컬럼 값을 합해서 그 값이 8보다 작으면 2번째 줄 2번째 컬럼의 4를 9로 바꿔줍니다. 
 
4) 그래서 5개의 데이터 셋에 대해 2번쨰 컬럼에서 5와 9가 나오는 빈도를 체크하고 그걸 데이터 인덱스와 함께 5줄로 기록합니다. 
 
그래서 제가 짜본 코드가 다음과 같습니다. AAA가 첫 컬럼, BBB가 두번째 컬럼, CCC가 4번째, 그리고 DDD가 5번쨰 입니다. 
 
<code>
with open ('input.txt', 'r') as infile:
  nlines = sum(1 for line in infile)
  nrange = range(nlines)
  data_lines = [None]*nlines
  i=0
  for i in nrange:
      data_lines[i] = file.readline()
  file.close()
  lines = 4081
  nlines_range = range(lines)
  ndata = nlines / lines
  ndata_range = range(ndata)
  AAA = [None]*lines
  BBB = [None]*lines
  CCC = [None]*lines
  DDD = [None]*lines
  num_q = [None]*ndata
  num_p = [None]*ndata 
  with open ('output_%s' %filename, 'w') as outfile:
     for j1 in ndata_range:
         for i1 in nlines_range:
             line = data_lines[i1].split() ##pre defined from upper part of my code
             AAA[i1] = int(line[0])
             BBB[i1] = int(line[1])
             CCC[i1] = int(line[3])
             DDD[i1] = int(line[4])
             while BBB[i1] == 2:
                if (BBB[CCC[i1]] == 4) and (BBB[DDD[i1]]) == 4: 
                   BBB[i1] = 5            
             while BBB[i1] == 4: 
                if BBB[CCC[i1]] + BBB[DDD[i1]] < 8:  
                   BBB[i1] = 9
                num_q[j1] = [BBB[i1]].count(9)
                num_p[j1] = [BBB[i1]].count(5)
         out = '%5d'%j1 + '%5d'%num_q[j1] + '%5d'%num_p[j1]
         outfile.write(out)
         outfile.write('\n')
    outfile.close() 
<code>
 
제가 아주아주 옛날에 포트란 했던 경험으로 짜다보니 if-loop 가 그거 비슷하게 가네요. 이게 문제인것 같습니다. 그리고 제가 저 BBB 값을 replace 하는게 맞는지 모르겠고, if loop의 조건 저 라인들은 분명 틀린거 같은데 저걸 도대체 어떻게 구현해야할지 몰라서...  도움 부탁 드립니다. 

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.